如果输入字符串作为输入,则以下函数会导致无限循环。
istream & inputFunc(istream &is)
{
int ival;
// read cin and test only for EOF; loop is executed even if there are other IO failures
while (cin >> ival, !cin.eof()) {
if (cin.bad()) // input stream is corrupted; bail out
throw runtime_error("IO stream corrupted");
if (cin.fail()) { // bad input
cerr<< "bad data, try again"; // warn the user
cin.clear(istream::failbit); // reset the stream
continue; // get next input
}
// ok to process ival
cout << "you entered: " << ival << endl;
}
}
如果输入字符串作为输入,则以下函数会导致无限循环。
输出:
再试一次数据,再试一次数据,再试一次数据,再试一遍数据,再试一遍数据,再试一遍数据,再试一次数据,再试一遍数据,再试一遍数据,再试一遍数据,再试一次数据,再试一次数据,再试一次数据,再试一次数据,再试一次数据,再试一次数据,再试一次数据,再试一遍数据,再试一次数据,再试一遍数据,再试一遍数据,
答案 0 :(得分:1)
你需要做两件事:
1)清除状态如下:cin.clear(istream::goodbit);
2)清除状态后一次跳过一个字符,因为你不知道下一个数字的开始位置:
char c;
cin >> c;
答案 1 :(得分:0)
是的,它确实无限循环。看看cin.clear()。
答案 2 :(得分:0)
坏数据是否仍然位于输入流中?如果是这样,这样的事情可能会有所帮助:
if (cin.fail()) { // bad input
string badData; // create a string to hold the bad input
cin.clear(istream::failbit); // reset the stream
cin >> badData; // read the bad input to clear the stream
cerr<< "bad data: " << badData << ", try again"; // warn the user
continue; // get next input
}