C++中std::cin输入非数字后无法刷新接收新输入如何解决
问题产生原因
- 当
std::cin读取到和目标变量类型不匹配的输入时,会自动将自身的fail错误状态位置为生效状态,处于错误状态的cin会直接跳过所有后续的输入操作,哪怕调用ignore清理缓冲区也不会恢复正常工作。 - 你当前代码只在输入失败时调用了一次
cin.ignore(),既没有重置错误状态,且ignore默认只清除1个字符,无法清空缓冲区里残留的全部无效输入内容,残留的无效内容会被下一次循环的读取操作再次判定为输入失败,就会出现无限循环的现象。
修复方案
你需要在处理输入失败的分支中,按顺序执行两个操作:
- 调用
cin.clear()重置cin的错误状态位,恢复其正常工作能力 - 调用带参数的
cin.ignore()清除输入缓冲区中所有残留的无效内容,直到遇到换行符为止,避免残留内容触发下一次输入错误
注意需要引入<limits>头文件调用std::numeric_limits来获取缓冲区最大长度参数,修正后的完整代码如下:
#include <windows.h> #include <iostream> // 新增头文件用于获取缓冲区最大长度 #include <limits> using namespace std; int main(void) { SetConsoleTitle(" "); while(true) { int x; if((cin >> x)) { cin.ignore(); if(x > 0) { cout << "Podmienka splnena\n"; }else{ cout << "Podmienka nesplnena\n"; } }else{ // 第一步:重置cin的错误状态位 cin.clear(); // 第二步:清空输入缓冲区所有残留内容直到换行符 cin.ignore(numeric_limits<streamsize>::max(), '\n'); cout << "Neplatny vstup\n"; } } }
内容的提问来源于stack exchange,提问作者Arty
相关产品推荐
相关产品推荐

