2015-02-07 75 views
1

我在程序中出現了一種奇怪的行爲,我花了很長時間試圖推斷出原因。這是一個毫無意義的無限循環。測試這些代碼行(懷疑)我得到了同樣的結果。每次我輸入一個非數字值這樣的符號,程序就會運行一個無限循環打印零點,我猜測cout是如何表示輸入的錯誤值。我想知道爲什麼來自cin的奇怪行爲,當它發現錯誤的讀數時,打印所有這些零而不是停止。cin在非數字值中讀取時出現無限循環

#include <iostream> 

using namespace std; 

int main() 
{ 
    int n = 0; 
    while(n >= 0) { 
     cin >> n; 
     cout << n << endl; 
     } 
    return 0; 
} 
+0

'cin'是在錯誤狀態下,你會知道如果你檢查了它,但你不知道。 – 2015-02-07 09:38:06

+1

可能的重複[爲什麼cin.clear()修復由cin輸入錯誤造成的死循環?](http://stackoverflow.com/questions/13715131/why-does-cin-clear-fix-an-infinite -loop引起的按輸入壞到CIN) – 2015-02-07 09:39:25

回答

3

程序貫穿一個無限循環打印零,我的猜測是多麼cout代表輸入了錯誤的值。

這是不完全正確:當你問cinint,但沒有int,你沒有價值復出,但無效的輸入保持在緩衝區中。當在循環的下一次迭代中再次詢問int時,同樣的事情再次發生,並且沒有進展:壞數據保留在緩衝區中。

這就是爲什麼你得到一個無限循環。爲了解決這個問題,你需要添加一些代碼來從輸入緩衝區中刪除不良數據。例如,你可以讀入一個字符串,而忽略輸入:

int n = 0; 
while(n <= 0) { 
    cin >> n; 
    if (!cin.good()) { 
     cin.clear(); 
     string ignore; 
     cin >> ignore; 
     continue; 
    } 
    cout << n << endl; 
} 

Demo.

1

你需要「吃」非數字輸入即

#include <iostream> 

using namespace std; 

int main() 
{ 
    int n = 0; 
    while(n >= 0) { 
     cin >> n; 
     if (!cin) { 
      char c; 
      cin >> c; 
     } else { 
      cout << n << endl; 
     } 
    } 
    return 0; 
}