2017-07-07 10 views
0

シンプルな学校プロジェクトで作業していましたが、私はwhileループを使用してユーザー入力の検証に関して小さな問題に遭遇しました。非整数が入力されるとwhileループが奇妙に変わる入力について

cout << "How much woud you like to bet?[100, 300, 500]" << endl; 
    cin >> int_input; 
    if (cin.fail()){ 
     int_input = 0; 
    } 

    //Validate check 
    while(int_input!=100 && int_input!=300 && int_input!=500){ 
     cout << "Please enter a valid bet [100, 300, 500]" << endl; 
     cin >> int_input; 
     if (cin.fail()){ 
      int_input = 0; 
     } 
    } 

問題が発生するとループは、新たな入力要求をスキップし、何度も繰り返しCOUTのMSGを吐き終わる:次のコードは、そうするために使用されます。私は非整数は、whileループのために常にtrueを返すと仮定しますが、プログラムは依然としてユーザ入力を求めなければなりません。

cin.failは最近追加されたもので、コードをそのままそのまま残していますが、問題が解決しないため、必要ない場合もあります。

+1

cinをリセットする必要があります。あなたはintを読んで、それに悪いデータを与え、ストリームをブロックしない悪い状態に置くように言った。 – Carcigenicate

+1

Fwiw、あなたがクリアしても、あなたはまだ悪いデータをスキップする必要があります、またはあなたはどこにいたのでしょう。 – WhozCraig

+0

短い答え: 'cin >>'が悪いので、特にユーザー入力のためには使用しないでください。 'std :: getline'ははるかに優れた動作をします。 – melpomene

答えて

3

ストリームでエラーが発生した場合は、値を0に設定します。だから、ループは再び実行されます...そして、エラーはストリームにまだあります。繰り返す。

エラーフラグをクリアする必要があります。

cin.clear(); 

そして、良い部分を取得するのに十分な「悪い」のデータを抽出、またはあなたがちょうどあなたが開始し、右戻ってきます。

+0

ありがとう、それを並べ替え – Ghal

関連する問題