2017-07-10 50 views
0

我的第一個while循環執行,直到我輸入一個非數字來終止它。然後,執行它,而不是執行,它將被跳過,導致程序終止/完成。我已經嘗試了一切,包括清除「cin bit」,如另一個類似問題中所述,但沒有成功。我究竟做錯了什麼?連續使用(cin >>輸入)成功

int main() { 
    double fah = 0; 
    cout << "Enter a fahrenheit value:\n"; 
    while (cin >> fah) { // executes until a non-number input is entered 
     cout << fah << "F == " << fah_to_cel(fah) << "C\n"; 
    } 
    // tried cin.clear(); here 
    // tried cin.clear(ios_base::eofbit); here 
    double cel = 0; 
    cout << "Enter a celcius value:\n"; 
    while(cin >> cel) { // executes until a non-number input is entered 
     cout << cel << "C == " << cel_to_fah(cel) << "F\n"; 
    } 
    return 0; 
} 
+0

您希望'clear()'重置錯誤標誌,然後'ignore()'放棄之前的輸入直到包括換行符。我會鏈接一個重複的問題... – Blastfurnace

回答

2

你是正確的調用cin.clear()。這會重置cin的錯誤標誌,在執行任何更多輸入操作之前,您需要執行此錯誤標誌。但你需要做更多的事情。輸入失敗時,cin試圖讀取的任何字符都保留在輸入緩衝區中。因此,當您嘗試再次收集輸入時(清除錯誤後),它將再次失敗。所以你需要刪除緩衝區中剩下的數據。你可以是這樣做的:

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

這告訴cin放棄所有字符在其緩衝器中,直到它找到一個換行符(這應該是在那裏,從你最後一次按下回車鍵)。

在我看來,這是一種非常笨重且容易出錯的方式來完成用戶輸入。我建議您在從cin讀取時專門使用std::getline,該值永遠不會失敗(除非發生內存分配失敗)。然後手動解析結果字符串,這使您可以更好地控制輸入的形式。