You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建限定整数范围且拒绝小数的C++输入验证函数

整数输入验证函数修复方案

原函数的核心问题在于直接用std::cin >> short会自动截断小数,且无法彻底清理输入缓冲区的残留内容。以下是修复后的实现,严格拒绝小数输入,同时确保无效输入后缓冲区完全清空:

#include <iostream>
#include <string>
#include <limits>
#include <cctype>
#include <climits>

unsigned short getChoice(short min, short max) {
    std::string input;
    short choice;
    bool valid = false;

    while (!valid) {
        // 读取整行输入,彻底避免缓冲区残留字符
        if (!std::getline(std::cin, input)) {
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
            std::cout << "输入错误,请重新输入。\n" << std::endl;
            continue;
        }

        // 验证输入是否为纯整数(仅当min为负数时允许开头负号)
        bool isInteger = true;
        size_t start = 0;
        if (!input.empty() && input[0] == '-') {
            start = 1;
            if (min >= 0) isInteger = false;
        }
        if (input.empty() || start == input.size()) {
            isInteger = false;
        }
        for (size_t i = start; i < input.size(); ++i) {
            if (!std::isdigit(input[i])) {
                isInteger = false;
                break;
            }
        }

        if (!isInteger) {
            std::cout << "无效输入,请输入整数。\n" << std::endl;
            continue;
        }

        // 转换并检查数值范围与溢出
        try {
            size_t pos;
            long long temp = std::stoll(input, &pos);
            if (pos != input.size() || temp < min || temp > max || temp < SHRT_MIN || temp > SHRT_MAX) {
                isInteger = false;
            } else {
                choice = static_cast<short>(temp);
                valid = true;
            }
        } catch (...) {
            isInteger = false;
        }

        if (!valid) {
            std::cout << "无效选择,请输入" << min << "到" << max << "之间的整数。\n" << std::endl;
        }
    }
    return choice;
}

关键改动说明

  • 整行读取输入:用std::getline读取完整一行,彻底解决输入缓冲区残留字符干扰后续读取的问题。
  • 纯整数校验:逐字符检查输入内容,直接拒绝包含小数点、逗号或其他非数字字符的输入,避免自动截断小数的情况。
  • 溢出与范围检查:先将输入转换为long long类型,再验证是否在short的取值范围以及指定的min-max区间内,避免转换溢出导致的异常。

验证场景

  • 输入3.5:直接提示无效输入,不会截断为3。
  • 输入abc:提示无效输入。
  • 输入10(在min-max范围内):正常返回对应数值。
  • 输入-5(当min为-10时):正常返回;当min为0时:提示无效。

内容的提问来源于stack exchange,提问作者Gablinsky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 09:53:04