2016-12-25 49 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

這不是你的問題的原因,它只是一個毫無意義的傳遞參考。通過ref傳遞'int'比傳遞值更昂貴。如果你需要修改它,你會這樣做,但你不這樣做。 – StoryTeller

回答

1

cin.ignore();其實是在cin.ignore(1, char_traits<char>::eof());通話。

因此,您並沒有清除任何剩餘換行符中的緩衝區。

以下應解決您的問題:

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

它清除下一個換行符,無論是在緩衝多遠(所有的實際目的)。

0

您應該在命令行中輸入數字,因爲變量「i」是整數。