C++ Input Handler异常:输入数字加后缀字符时逻辑出错
输入数字加字符串时的缓冲区残留问题解决方案
你的问题根源在于cin >> Answer的行为:它会跳过前导空白,读取连续的数字字符后立即停止,遇到非数字字符就不再处理。所以输入1ddga时,程序会把1存入Answer,剩下的ddga\n会留在输入缓冲区里,下次调用InputHandler时,cin会先读取这些无效字符,直接触发错误。
下面是修正后的代码,能直接处理这类输入,确保缓冲区不会残留无效内容:
#include <limits> #include <string> #include <iostream> #include <cmath> #include <cctype> class Handlers { public: float InputHandler(std::string Question, unsigned short int Number_of_Answers); void ErrorHandler(int errCode); // 假设该错误处理函数已实现 }; float Handlers::InputHandler(std::string Question, unsigned short int Number_of_Answers) { float Answer; std::cout << Question << std::endl << std::endl; while (true) { // 第一步:尝试读取数字 if (!(std::cin >> Answer)) { std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); ErrorHandler(InputErrorNumber); continue; } // 第二步:检查数字是否在有效范围且为整数 if (Answer < 1 || Answer > Number_of_Answers || std::fmod(Answer, 1) != 0) { std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); ErrorHandler(InputErrorNumber); continue; } // 第三步:检查数字后是否有多余非空白字符 char leftover; if (std::cin.get(leftover) && leftover != '\n' && !std::isspace(leftover)) { std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); ErrorHandler(InputErrorNumber); continue; } // 所有校验通过,退出循环返回结果 break; } return Answer; }
核心修改说明
- 新增多余字符校验:读取完数字后,用
cin.get()获取下一个字符,如果该字符不是换行符也不是空白字符,说明输入存在多余的非数字内容,直接判定为无效输入。 - 拆分逻辑判断:把原来复杂的while条件拆成多步独立校验,逻辑更清晰,也方便插入额外的检查步骤。
- 强制清空缓冲区:无论哪种错误情况,都会先重置输入流的错误状态,再清空缓冲区到换行符,彻底避免残留内容影响后续输入。
这样修改后,输入1ddga这类内容时,程序会直接判定为无效输入,触发错误提示并清空缓冲区,不会把1当作有效答案返回,也不会影响下一次函数调用。
内容的提问来源于stack exchange,提问作者Andrei Voicea
相关产品推荐
相关产品推荐

