C++校验用户输入是否为int类型时输入非法触发死循环问题求解
问题根因
- 当
cin读取整数遇到非法输入时,会同时触发两个异常状态:- 输入流的
fail错误位被置位,该状态不主动清除的话,后续所有cin操作都会直接跳过,不会等待用户输入 - 输入的非法字符会残留在输入缓冲区中,下次读取操作仍会优先读到老的错误内容,反复触发失败逻辑
- 输入流的
解决方案
在判定cin.fail()为真后,新增两步处理:
- 调用
cin.clear()清空输入流的错误状态位,让输入流恢复可工作状态 - 调用
cin.ignore()清空输入缓冲区里的残留错误内容,避免重复读取旧输入
修正后的代码
// 注意如果用到numeric_limits需要提前引入<limits>头文件 #include <limits> // ... 其他代码 ... again1: // Inloop point 1 cout << " " << player1 << ", where would you like to place a chip? Enter the index (1 - 9).\n" << endl; int index1; // Initializing index 1 cin >> index1; // Writing input of player 1 into index 1 if (cin.fail()) { cout << "Error" << endl; cin.clear(); // 重置输入流错误状态 // 清空缓冲区中所有残留内容,直到遇到换行符 cin.ignore(numeric_limits<streamsize>::max(), '\n'); goto again1; }
额外提示:原代码中
cout << " " + player1的写法存在风险,若player1是std::string类型," "是const char*类型,直接相加会触发指针偏移而非字符串拼接,建议统一用<<做输出流拼接。
内容的提问来源于stack exchange,提问作者user12965285
相关产品推荐
相关产品推荐

