C++中while循环遇非数字输入陷入无限循环的原因解析
问题原因分析及修复方案
核心问题原因
- 类型不匹配+输入失败未处理:
- 你定义的
val1和val2是int类型,当输入|这类非数字字符时,cin尝试把字符转换为整数会直接失败,此时cin会触发错误状态位(failbit),后续所有输入操作都会直接跳过,不会再读取控制台的输入内容。 - 你的终止判断
val1=='|' || val2=='|'完全无效:val1是int类型,'|'是字符,二者比较的是ASCII值(|的ASCII是124),但输入失败时val1和val2的值根本不会被更新,还是初始的0,所以这个条件永远不会成立,循环没法终止。 - 错误状态位没被清除,导致
cin一直处于失效状态,循环会无限重复执行输出提示的代码,陷入死循环。
- 你定义的
修复方案
可以通过两种方式解决:
方式1:先读取字符串判断终止符,再转整数
先读取输入内容为字符串,检查是否包含|,如果有就终止循环;没有的话再把字符串转成整数处理:
#include<iostream> #include<string> using namespace std; int main() { string s1, s2; bool running = true; while(running) { cout << "Enter 2 numbers: " << endl; cin >> s1 >> s2; if(s1 == "|" || s2 == "|") { running = false; break; } // 字符串转整数 int val1 = stoi(s1); int val2 = stoi(s2); cout << val1 << " " << val2 << endl; } return 0; }
方式2:处理cin的错误状态
如果坚持用int类型读取,需要在输入失败时清除错误状态并丢弃无效输入:
#include<iostream> #include<limits> using namespace std; int main() { int val1=0, val2=0; bool running = true; while(running) { cout << "Enter 2 numbers: " << endl; // 检查输入是否成功 if(!(cin >> val1 >> val2)) { // 检查是否是终止符 char c; cin.clear(); // 清除错误状态 cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 丢弃当前行的无效输入 cin >> c; if(c == '|') { running = false; } } else { cout << val1 << " " << val2 << endl; } } return 0; }
内容的提问来源于stack exchange,提问作者Rashad Malikov
相关产品推荐
相关产品推荐

