2016-12-25 5 views
0

これはどうして起こるのでしょうか?cin.fail()のループを解決するには

sample run

void askNQ(int &noq) 
{ 
    bool x = true; 
    while (x) 
    { 
     int i; 
     cout << "How many questions would you like(out of " << noq << ")?" << endl; 
     cin >> i; 

     if (cin.fail()) 
     { 
     cin.clear(); 
     cin.ignore(); 
     cout << "Sorry, that is not valid." << endl; 
     x = true; 
     } 
     else if (i > noq) 
     { 
      cout << "Sorry, that is too many." << endl; 
      x = true; 
     } 
     else if (i <= 0) 
     { 
      cout << "Sorry, that is too less." << endl; 
      x= true; 
     } 
    } 
} 
+0

あなたは 'noq'を変更しません、どうしてこれは参照渡しですか? – StoryTeller

+0

yah noqは参照渡しです。 noqが問題になることがありますか? – Beng970804

+0

それはあなたの問題の原因ではありません、それはちょっと無意味な参照渡しです。 'int'をrefで渡すのは、それを渡すよりもコストがかかります。あなたはそれを変更する必要がある場合はそれを行うだろうが、そうしない。 – StoryTeller

答えて

1

cin.ignore();実際にcin.ignore(1, char_traits<char>::eof());の呼び出しです。

残っている改行のうちバッファーをクリーニングしていません。

以下はあなたの問題を解決する必要があります。

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

それは(すべての実用的な目的のために)に関係なく、それがバッファ内にどれだけ離れているか、次の改行文字をクリアしていません。

0

変数 "i"は整数なので、コマンドラインで数値を入力する必要があります。

関連する問題