如何清除cin输入缓冲区?捕获异常后程序仍无法正常运行
问题分析与解决
你的核心问题有两个:
cin.clear的用法完全错误,它的作用是清除流的错误状态位,而非直接操作缓冲区内容- 捕获异常后仅清除状态位还不够,必须清空输入缓冲区里的错误数据,否则下一次读取会重复触发异常
错误点拆解
cin.clear(80, '\n')是错误用法:cin.clear的参数是流状态标志(比如ios::goodbit),默认不传参就是清除所有错误状态,你写的参数完全不符合函数要求,导致错误状态没有被正确重置。- 未清空输入缓冲区:当输入非数字内容触发
failbit后,错误的输入内容还留在缓冲区里,下一次cin >> inputName会直接读取这些错误内容,再次触发异常,导致程序停滞。
修正后的完整代码
#include <iostream> #include <string> #include <limits> // 需要包含这个头文件来使用numeric_limits using namespace std; int main() { string inputName; int age; // 设置cin的异常掩码,仅当failbit触发时抛出异常 cin.exceptions(ios::failbit); cin >> inputName; while (inputName != "-1") { try { cin >> age; cout << inputName << " " << (age + 1) << endl; } catch (ios_base::failure& excpt) { age = 0; cout << inputName << " " << age << endl; // 清除cin的错误状态位,恢复流的可用状态 cin.clear(); // 忽略缓冲区中所有剩余字符直到换行符,彻底清空错误输入 cin.ignore(numeric_limits<streamsize>::max(), '\n'); } inputName = ""; cin >> inputName; } return 0; }
关键修正说明
cin.clear():重置流的错误状态,让cin回到可读取状态cin.ignore(numeric_limits<streamsize>::max(), '\n'):numeric_limits<streamsize>::max()表示忽略尽可能多的字符,直到遇到换行符为止,这样能把缓冲区里的错误输入完全清空,避免下一次读取触发异常
内容的提问来源于stack exchange,提问作者SeeLamb
相关产品推荐
相关产品推荐

