为什么下面的代码在输入字符或字符串时会导致无限循环?我已经看到了有关它的问题,以及答案中提供的解决方案(例如here),但它似乎没有任何帮助。代码实现了那里建议的解决方案,但它仍然导致无限循环。
#include <iostream>
#include <bitset>
#include <limits>
using namespace std;
int main() {
int n;
while (!(cin >> n)) {
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cin.clear();
cout << std::bitset<8>(cin.rdstate()) << endl;
cin >> n;
cout << std::bitset<8>(cin.rdstate()) << endl;
}
cout << n;
return 0;
}
g++ --version
大吼大叫:g++ (Ubuntu 6.2.0-5ubuntu12) 6.2.0 20161005
该计划的输出如下:
00000000
00000100
00000000
00000100
... and so on
尽管流已被清除且所有输入都被忽略,但似乎该值正在重新进入。
答案 0 :(得分:1)
您在ignore
之前致电clear
,但ignore
仅在流没有错误时才有效,但此时始终有错误。
当您切换两个语句时,它可以正常工作:在一个或多个无效输入之后,您需要2个连续的有效输入才能成功终止程序。