2011-05-03 65 views
17

在接下來的循環中,如果我們鍵入字符作爲cin輸入,而不是其預期數字,那麼它進入無限循環。任何人都可以向我解釋爲什麼發生這種情況?CIN的無限循環中輸入字符串時,而一些有望

當我們使用cin,如果輸入的不是數字,那麼是否有辦法來檢測這種以避免上述問題?

unsigned long ul_x1, ul_x2; 

while (1) 
{ 
    cin >> ul_x1 >> ul_x2; 
    cout << "ux_x1 is " << ul_x1 << endl << "ul_x2 is " << ul_x2 << endl; 
} 

回答

23

那麼你將永遠有一個無限循環,但我知道你真的想知道究竟是爲什麼CIN不守提示輸入每個循環迭代引起你的無限循環FREERUN。

的原因是因爲在CIN你所描述的情況失敗,將無法讀取任何更多的投入到這些變量。通過給cin壞輸入,cin進入fail state並停止提示輸入的命令行導致循環空閒運行。

對於簡單的驗證,可以嘗試使用CIN通過檢查CIN是否處於故障狀態,以驗證您的輸入。當出現故障clear the fail狀態並迫使流到throw away the bad input。這會將cin返回到正常操作,以便您可以提示輸入更多信息。

if (cin.fail()) 
    { 
    cout << "ERROR -- You did not enter an integer"; 

    // get rid of failure state 
    cin.clear(); 

    // From Eric's answer (thanks Eric) 
    // discard 'bad' character(s) 
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

    } 

對於更復雜的驗證,您不妨先讀入一個字符串,並做更復雜的檢查對字符串,以確保它符合你的期望。

+0

或者更好的是,一個字符串流。 – Maxpm 2011-05-03 03:48:53

+0

如果我在cin失敗後調用cin.clear(),爲什麼下次我調用cin >> x時仍然不會要求輸入? – 2011-05-03 04:02:01

+0

此答案不能解決OP遇到的問題,因爲它是**不完整**。請看看我的回答:) – 2011-05-03 05:31:45

6

注意

請注意以下解決方案。目前還不完全清除您的案例中的錯誤。 你仍然會得到一個無限循環!

if (cin.fail()) 
{ 
    cout << "Please enter an integer"; 
    cin.clear(); 
} 

完整的解決方案

的原因是,你需要清除流的失效狀態,以及廢棄處理的字符。否則,糟糕的角色仍然存在,你仍然會遇到無限循環。 你可以簡單地通過std :: cin.ignore()來實現這一點。例如,

if (cin.fail()) 
{ 
     cout << "Please enter an integer"; 
     // clear error state 
     cin.clear(); 
     // discard 'bad' character(s) 
     cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
} 

另一種解決方案

您還可以使用getlinestringstream實現。這裏是一個簡單的例子。

string input; 
    while (1) 
    { 
     getline(cin, input); 
     stringstream(input) >> x; 
     cout << x << endl; 
    } 
+0

謝謝,解決了我的答案中的錯誤 – 2011-05-03 12:35:36

1

也許,這是因爲,

  1. CIN是流功能。當進入一個 非數字代替 的數字,它被忽略。並提示您重新輸入 。
  2. 即使你確實給數字輸入, 你會被提示輸入更多的投入,因爲你是在一個無限循環。

你可以像這樣解決這個問題: 1.創建一個函數接受一個字符串輸入。 2.轉換後以數字形式返回。使用strtod()進行轉換。

希望這有助於:)

0

另一種選擇是operator!,它相當於成員函數fail()

//from Doug's answer 
if (!cin) 
{ 
    cout << "ERROR -- You did not enter an integer"; 

    // get rid of failure state 
    cin.clear(); 

    // From Eric's answer (thanks Eric) 
    // discard 'bad' character(s) 
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
}