2010-01-06 62 views
0

我不明白,爲什麼在步驟3中cin >> W;被省略,如果我輸入的不是數字(即's')。爲什麼步驟3中的std :: cin被忽略?

#include <cstdlib> 
#include <iostream> 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    short W = -1; 

    cout << "step 1) W = " << W << endl; 
    cout << "give a number: "; 
    cin >> W; 

    if (cin.fail()) 
    { 
    cout << "ERROR, bad number" << endl; 
    W = -1; 

    cout << endl << "step 2) W == " << W << endl; 
    cin.clear(); 
    } 

    cout << endl << "step 3) W == " << W << endl; 
    cout << "give a number: "; 
    cin >> W; 

    cout << endl << "step 4) W == " << W << endl; 

    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 
+0

我認爲這段代碼更多的是關於如何使用'cin >>'和'cout <<'。不用說,這是一個相當可怕的代碼;所以不要用它作爲你的靈感。 – notnoop 2010-01-06 13:07:32

+0

notnoop:也許它是horrbile,但我想明白爲什麼它的工作方式,而不是爲什麼它看起來像這麼可怕.. – qlf00n 2010-01-06 13:13:34

+0

不要忘記接受Steffen的答案,如果它解決了你的問題。 – Bill 2010-01-06 14:59:59

回答

3

我假設你對第1步輸入非數字然後第3步看起來不起作用的情況感到困惑。

問題是,cin.clear()只清除流的錯誤標誌。錯誤的輸入不會從流中取出,因此下一個cin >> W只會再次讀取相同的錯誤輸入。

例如,您可以從cin中填充一個字符串,其中包含一切,或者您可以使用cin.ignore()忽略輸入流中的以下字符。

有關更詳細的解釋,請參閱http://www.arachnoid.com/cpptutor/student1.html

+0

問題是我試圖把一個/兩個'cin.ignore();'如果塊內部,似乎它不工作..這就是爲什麼我對'它是如何工作'的困惑 – qlf00n 2010-01-06 13:30:58

+0

好的,我明白了,'cin.clear();'必須是** BEFORE **'cin.ignore();'不是之後..謝謝你的鏈接..現在我明白了什麼意思'破流' ..現在,該帖子可以關閉 – qlf00n 2010-01-06 13:37:13