2016-09-02 17 views
1

私は次のコードにいくつか問題があります。私はXcode(OS X)で使っています。どのように入力リセットSTDへ使用時にstd :: cinをリセットする方法は?

[そのコードの私の最初の試みを削除]

:: CIN?私は別の値を入力しようとするが、私はstd :: cinが私の間違った値の後ではもう動作しないように見えるのでできない。ループ内で私だけ入力5つの値ここで

for (unsigned char i = 0; i < 5; i++) { 

    int value = 0; 

    std::cout << "\n>> Enter \"value\": "; 
    std::cin >> value; 

    if (std::cin.fail()) { 
     std::cin.clear(); 
     std::cin.ignore(); 
     std::cout << "Error: It's not integer value!\n"; 
    } else { 
     std::cout << "The value format is ok!\n"; 
    } 

    std::cout << "value = " << value << std::endl; 

} 

:私はこのコードを使用して、私の2回目の試行で

UPD2 。毎回私は間違ってチェックします。間違った値( "asdf")を設定すると、std :: cinは狂ってしまい、もう動作しません。

>> Enter "value": 4 
The value format is ok! 
value = 4 

>> Enter "value": 234 
The value format is ok! 
value = 234 

>> Enter "value": asdfghjkl 
Error: It's not integer value! 
value = 0 

>> Enter "value": Error: It's not integer value! 
value = 0 

>> Enter "value": Error: It's not integer value! 
value = 0 
234 
234 
78 
345 
657 
345 
dsf 
f 

答えて

4

あなたが使用することができ、条件は、std::cin.fail()が起こる:その後、

std::cin.clear(); 
std::cin.ignore(); 

、ループを続行、continue;文を使用して、私はこの出力を取得します。 std::cin.clear()はエラーフラグをクリアして新しいフラグを設定し、std::cin.ignore()は効果的に無視します(抽出および破棄)。

出典:

  1. cin.ignore()
  2. cin.clear()
+0

回答が@Galik –

+3

更新されます 'clear'は、ストリームのエラー状態フラグをクリアします。キャラクターとは何もしません。引数を指定しないで 'ignore'を実行すると、1文字だけが破棄されます。つまり、' 'asdf ''と入力すると4回ループして、入力をやり直す前に入力が間違っていることを示します。 'std :: cin :: ignore(std :: numeric_limits :: max()、 '\ n')'を実行して、行の終わりまで破棄する必要があります。 –

+0

@BenjaminLindley - "std :: cin :: ignore"に問題があります。私はCLangを使用していますが、それはstd :: cin.ignoreでなければならないようですが、1つのパラメータしかありません。 – JavaRunner

関連する問題