如何创建限定整数范围且拒绝小数的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
相关产品推荐
相关产品推荐

