2012-02-15 110 views
0

我有一個C++程序,它從終端的輸入,以及用於某種原因,這是生產的無限循環:C++無限循環與輸入

double getSideLength() 
{ 
    cout << "Enter a side: " 
double side; 
cin >> side; cin.ignore(80, '\n'); 
while (side <= 0){ 
    cout << "Please enter a valid side. Try again: "; 
    cin >> side; cin.ignore(80, '\n'); 
} 
return side; 

這將產生輸出:

Enter a side: invalid 
Please enter a valid side. Try again: 
Please enter a valid side. Try again: 
Please enter a valid side. Try again: 
    .... and so on. "invalid" is the only input the user made 
+1

你使用ignore子句是什麼? – 2012-02-15 07:19:10

回答

2

如在operator>> documentation中所述,如果「獲得的輸入不能被解釋爲適當類型的元素」,則流將其失敗。如果輸入錯誤的號碼,會發生這種情況所以你只需在下一次輸入之前清除()cin。這裏是代碼:

double getSideLength() 
{ 
     double side; 
     cout << "Enter a side: "; 
     cin >> side; 
     if (!cin) 
      cin.clear(); 
     cin.ignore(80, '\n'); 
     while (side <= 0){ 
       cout << "Please enter a valid side. Try again: "; 
       cin >> side; 
       if (!cin) 
        cin.clear(); 
       cin.ignore(80, '\n'); 
     } 
     return side; 
} 
0
double getSideLength() 
{ 
    double side; 
getinput: 
    cout << "Enter a side: " 
    cin >> side; cin.ignore(80, '\n'); 
    if(side <= 0) 
    { 
     cout << "Please enter a valid side. Try again: " 
     goto getinput; 
    } 
    return side; 
} 

試試這個,我希望這對你有所幫助

+0

您不應該在代碼中使用goto子句。 – Pochi 2012-02-15 07:30:12

+0

即時對不起爲什麼?即時通訊不是一個C++大師和編號喜歡知道原因。謝謝...... – 2012-02-15 07:32:44

+1

@Pochi:他們可能很難讀,遵循和維護,但他們沒有什麼*錯誤*(即使是MS示例都有),編譯器會將所有循環都轉換爲計算跳轉。 – Necrolis 2012-02-15 07:34:04

1

這應該解決這個問題。使用!(cin >> side)將確保我們從cin獲得正確的類型。

double getSideLength() 
{ 
    cout << "Enter a side: " << std::endl; 
    double side = -1; 
    while (! (cin >> side) and side <= 0) 
    { 
     cout << "Please enter a valid side. Try again: "; 
     cin.clear(); 
     cin.ignore(1000, '\n'); 
    } 

    return side; 
} 
0

似乎有很多錯綜複雜的與cin和在一般情況下,解釋here,它可能是最好你用函數getline代替,然後使用atoi

另外,還討論了here這個無限循環的問題。如果您想使用cin,則可以將輸入轉換爲字符串變量,然後使用atoi將其轉換爲整數,如this post中所示。