だから私は私のコードのこの部分を持っています:
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.
...
などなど、永遠に。ユーザーが入力を完了してもかまいませんが、「無効な入力です。再試行してください」という無限の出力を回避するにはどうすればよいですか。間にプロンプトが表示されませんか?