2016-04-12 13 views
1

最初にあなたのソースを見せてあげましょう。はcin.clear()とcin.ignore()の間にシーケンスが必要ですか?

#include <iostream> 
#include <limits> 

using namespace std; 

int main() { 
    int n; 

    while (true) { 
     cout << "Type >> "; 
     cin >> n; 

     if (cin.fail()) { 
      cin.clear(); 
      cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
      cout << "Not a number" << endl; 

      continue; 
     } 

     if (n % 2) 
      cout << "odd"; 
     else 
      cout << "even"; 

     cout << endl; 
    } 

    return 0; 
} 

まあ、このコードは問題なく実行できます。しかし、私がcin.clear()とcin.ignore()の間を入れ替え、文字(整数ではない)を入力すると、無限ループに突き当たります。

#include <iostream> 
#include <limits> 

using namespace std; 

int main() { 
    int n; 

    while (true) { 
     cout << "Type >> "; 
     cin >> n; 

     if (cin.fail()) {    
      cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
      cin.clear(); 
      cout << "Not a number" << endl; 

      continue; 
     } 

     if (n % 2) 
      cout << "odd"; 
     else 
      cout << "even"; 

     cout << endl; 
    } 

    return 0; 
} 

私は順序がcin.clear間neccesaryあるだろう(次のコードを参照してください)()とcin.ignore()。 もしそうなら、なぜそれがシーケンスを必要としているのか知りたいです。

私の質問を読むためのThx。私はあなたの返事にとても感謝しています。 Inarticulate Writingにごめんなさい。

答えて

0

はのステップにより、第2のスニペットのステップを見てみましょう:

if (cin.fail()) { 

我々はこれを入力すると、ストリームがすでに悪いです。したがって、入力操作

cin.ignore(numeric_limits<streamsize>::max(), '\n'); 

はすぐに失敗し、何もしません。したがって、

cin.clear(); 

後にゴミ入力ストリームにまだあると

cin >> n; 

も最初に私たちを取り戻すの入力を待たずに、再び失敗します。

あなたは(最初のスニペットのように)周りの呼び出しを交換した場合、clearは、ストリームが「良い」再び、その後、ignoreが正常にゴミ入力を取り除く、そして期待通りcin >> n;が動作するようになります。

+0

わかりました。今私は理由を知っている。 Thx!cin.ignail(numeric_limits :: max()、 '\ n')はcin.failbitがすでに設定されているとうまくいきません。 –

+0

@ChingChangeatthebaby正解ですが結局は入力機能でも​​あります。 –

0

cin.fail()が真である間に、ストリームからの読み込みはすべて失敗します。

cin.clear()を呼び出すと、ストリームから障害フラグが削除され、再度入力が可能になります。

関連する問題