2013-11-26 71 views
1

這裏我試圖從用戶獲取一個整數,當輸入正確時循環。重新設置cin流狀態C++

輸入非整數值後(例如「dsdfgsdg」),cin.fail()返回true,如預期的那樣,while循環體開始執行。

這裏我重置cin的錯誤標誌,使用cin.clear();和cin.fail()按預期返回false。

但是,下次調用cin不起作用,並重新設置錯誤標誌。

任何想法?

#include<iostream> 
using namespace std; 

int main() { 
    int a; 
    cin >> a; 

    while (cin.fail()) { 
    cout << "Incorrect data. Enter new integer:\n"; 
    cin.clear(); 
    cin >> a; 
    } 
} 
+2

您必須使用'cin.ignore(...)清除輸入流' – smac89

回答

4

cin.clear()後,你這樣做:

#include <iostream> //std::streamsize, std::cin 
#include <limits> //std::numeric_limits 
.... 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n') 

什麼上面所做的是,它會清除的那些仍然留在那裏的任何字符輸入流。否則CIN將繼續嘗試讀取相同的字符和失敗

2

作爲一個風格問題,喜歡這種方法:

int main() 
{ 
    int a; 
    while (!(std::cin >> a)) 
    { 
     std::cout << "Incorrect data. Enter new integer:" << std::endl; 
     std::cin.clear(); 
     std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    } 
} 
1

cin.clear()不清除緩衝區;它會重置錯誤標誌。因此,在清除緩衝區之前,您仍然需要在緩衝區中輸入數據,並且代碼將不允許您輸入新數據。 cin.Ignore()應該訣竅