2016-09-30 7 views
0

文字を押すと無限ループになるのはなぜですか?エラーチェック時にコードが無限ループにならないようにするにはどうすればよいですか?文字を押すと無限ループになるのはなぜですか?エラーチェックのためにどのように変更しますか?

#include <iostream> 
using namespace std; 

int main() 
{ 
    int number; 
    cout << "Enter a number in the range 1-100: "; 
    cin >> number; 

    while (number > 1 || number < 100) 
    { 
     cout << "ERROR: Enter a value in the range 1-100: "; 
     cin >> number; 

    } 
    return 0; 
} 
+0

私は(かなりstackoverflow.com上、ここでいくつかの、より広いインターネット上のうち、さらにがある)良いの重複を見つけるために怠惰にだけど、問題の要点は、そのときの入力演算子であります入力を数値として解析できず、入力をバッファに残し、何も削除しません。ループのたびに同じ入力を何度も何度も繰り返し読み込みます。あなたを助けるための[ignore関数について](http://en.cppreference.com/w/cpp/io/basic_istream/ignore)を読んでください。 –

+0

while文の条件が何をしているかを考えます。 – 1201ProgramAlarm

+0

以前のコンパイラやビルドをpre-C++ 11モードで使用している場合、不正な入力に対して 'number'が変更されないため、*未定義の動作*があることにも注意してください。そして初期化されていないので、*不定値*を持ち、ループ内の比較によってUBが得られます。 –

答えて

1

std :: cinはタイプセーフであるため、文字が「int number」の有効な入力ではないことがわかります。 std :: cinでエラーフラグを立てると、それ以降の操作は失敗し、すぐに戻ります。

先に進む前に、エラー状態を確認してエラーフラグをクリアする必要があります。

は、既存のポストにWhy do I get an infinite loop if I enter a letter rather than a number?

+0

ありがとう! @タンギー・フォートレー –

0

おかげでたくさんのy'allを参照してください。私はこれで終わりました。

while (!(cin >> number)) 
{ 
    cout << "ERROR: Enter a value in the range 1-100: "; 

    //to clear input stream 
    cin.clear(); 

    //to discard previous input 
    cin.ignore(1200, '\n'); 

    cin >> number; 
} 
関連する問題