cin.ignore执行后程序停滞,如何实现输入验证循环?
问题修复:输入验证循环失效与cin.ignore无响应问题
你的代码有两个关键问题导致错误输入后程序无响应:
核心问题分析
- 循环条件错误:
do-while的循环条件写死为false,意味着循环只执行一次,错误输入后无法回到开头重新读取用户输入。 - cin.ignore未指定终止符:调用
cin.ignore(std::numeric_limits<std::streamsize>::max())时没传入终止字符,默认会一直读取直到流结束,导致程序卡住等待更多输入。
修复后的代码
#include<iostream> #include<array> #include<limits> // 必须包含此头文件才能使用std::numeric_limits using std::cout; using std::cin; using std::array; void inv() { cout << "invalid input, try again: "; } int main() { constexpr array test { "Yes", "no", "test", "maybe", "eventually", "could be", }; int n; bool input_valid; do { input_valid = true; cin >> n; if (cin.fail() || n < 0 || n >= test.size()) { inv(); cin.clear(); // 清除输入流的错误状态 // 忽略到换行符为止,清空当前输入行的无效内容 cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); input_valid = false; } } while (!input_valid); // 输入无效时持续循环 cout << test[n]; return 0; }
修改说明
- 调整循环逻辑:新增
input_valid变量标记输入有效性,循环条件改为!input_valid,确保输入错误时会回到循环开头重新读取。 - 完善cin.ignore:添加
'\n'作为终止符,让ignore仅清空当前输入行的残留内容,不会无限等待输入。 - 补充必要头文件:添加
<limits>头文件,因为std::numeric_limits需要该头文件支持。
修改后,错误输入时程序会提示重新输入,且能正常响应新的输入,直到用户输入有效数据为止。
内容的提问来源于stack exchange,提问作者Nyto Dork
相关产品推荐
相关产品推荐

