所以我有这部分代码:
void safeInput( int *n, int low, int up )
{
while ( !( cin >> *n ) || ( low != -1 ? *n < low : false ) || ( up != -1 ? *n > up : false )) {
if ( cin.fail() ) {
cin.clear();
cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
}
if ( cin.eof() ) {
cin.clear();
}
cout << "Invalid input. Please try again.\n";
}
cin.ignore( 1 );
}
只是为了澄清第 3 行,low 和 up 是 n 的允许值的下限和上限。这些在函数调用中指定。值 -1 表示无穷大(上下无限制)。
无论如何,我的问题是当用户输入一个字符时,这个函数设法捕获错误,比如'a'、'@@'或大多数其他乱码。但是如果用户输入 ^D (EOF),那么程序仍然会陷入死循环,即使我确实使用了 cin.eof() 和 cin.clear()。可能是什么问题呢?
编辑:
为了阐明程序中发生的情况,这里有一个示例提示和用户输入:
Enter row size: 1
Enter column size: a
Invalid input. Please try again.
-1
Invalid input. Please try again.
^D
Invalid input. Please try again.
Invalid input. Please try again.
Invalid input. Please try again.
Invalid input. Please try again.
Invalid input. Please try again.
Invalid input. Please try again.
...
以此类推。我不介意用户完成输入,但是如何避免无休止地打印“无效输入。请重试”。中间没有提示?