10

次のループがあります。EndOfFile、またはユーザー入力 -999まで数字を読み取る必要があります

int arr[100];

int index;

for (index = 0; index < 100; index++)
{
 cin >> arr[index];
 if (!cin)
 {
  cin.clear();
  index--;
  continue;
 }
 if (arr[index] == -999)
 {
     break;
 }
}

ユーザーが s などの無効なものを入力すると、エラー状態になったり停止したりすることcharなく、このループが永遠に繰り返されます。clear

4

1 に答える 1

10

を呼び出した後clear、何らかの方法で無効な入力をストリームから削除する必要もあります。1 つの方法を次に示します。

 cin >> arr[index];
 if (!cin)
 {
  cin.clear();
  std::string ignoreLine; //read the invalid input into it
  std::getline(cin, ignoreLine); //read the line till next space
  index--;
  continue;
 }

これcinは、無効な入力の読み取りに失敗すると、ストリームに残るためです。なんらかの方法で削除する必要があります。読んで無視するだけです。

次のようにも使用できますignore

cin.clear();
cin.ignore(std::numeric_limits<streamsize>::max(),' ');

私の意見では、入力がスペースで区切られている場合(および無効な入力を検査したくない場合)は、これの方が優れています。オンラインドキュメントには次のように書かれています:

istream::無視

istream& ignore( streamsize n = 1, int delim = EOF );

文字の抽出と破棄

入力シーケンスから文字を抽出して破棄します。

n 文字が抽出されて破棄されるか、文字 delim が見つかったときのいずれか早い方で、抽出は終了します。後者の場合、delim 文字自体も抽出されます。

于 2011-09-14T08:22:25.633 に答える