2011-09-14 12 views
8

次のループがあります。それはEndOfFileまでの数字を読み、またはユーザー入力が無効なもの、などいくつかのchar sと、このループはclearがエラー状態をINGのか、停止することなく、永遠に繰り返されているユーザー入力-999cin.clear()はcinオブジェクトをリセットしません

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; 
} 
} 

必要があります。

答えて

8

clearを呼び出した後、無効な入力をストリームから削除する必要があります。ここでは一つの方法である:

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(),' '); 

online docは言う:

のIStreamは::無視

のIStream &無視(STREAMSIZE N = 1、INT DELIM = EOF)。

を抽出し、廃棄した文字

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

n文字が抽出され、 が破棄されたとき、またはデリミタが見つかったときのどちらか早い方のどちらか早い方で抽出が終了します。 後者の場合、デリミタ文字自体も抽出されます。

+1

したがって、無限ループ! –

+0

@ Mr.DDD:そうです。 :-) – Nawaz

+0

@ Mr.DDD:あなたの提供する無効な入力は何ですか? – Nawaz

関連する問題