2012-05-31 20 views
7

下面是代碼如何使CIN只拿數字

double enter_number() 
{ 
    double number; 
    while(1) 
    { 

     cin>>number; 
     if(cin.fail()) 
     { 
      cin.clear(); 
      cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
      cout << "Invalid input " << endl; 
     } 
     else 
     break; 
     cout<<"Try again"<<endl; 
    } 
    return number; 
} 

我的問題是,當我輸入類似1X,然後1被作爲輸入沒有注意到被冷落的另一個運行特徵。 有什麼辦法可以讓它與任何實數一起工作1.8?

+0

將所有內容讀入一個字符串並相應地解析輸入? – Rhexis

+0

使用cin.get()然後檢查EOF字符? – Ansari

回答

7

我會用std::getlinestd::string讀取整個行,然後只跳出循環的時候,你可以在整條生產線轉換爲雙倍。

#include <string> 
#include <sstream> 

int main() 
{ 
    std::string line; 
    double d; 
    while (std::getline(std::cin, line)) 
    { 
     std::stringstream ss(line); 
     if (ss >> d) 
     { 
      if (ss.eof()) 
      { // Success 
       break; 
      } 
     } 
     std::cout << "Error!" << std::endl; 
    } 
    std::cout << "Finally: " << d << std::endl; 
} 
19

當CIN遇到輸入它不能正確地讀取在所指定的變量(諸如輸入查詢的字符轉換成一個整數變量),它進入錯誤狀態並離開輸入在它的緩衝器中。

你要做的幾件事情要妥善處理這種情況。

  1. 你要測試這個錯誤狀態。
  2. 你必須清除錯誤狀態。
  3. 你必須要麼替代地處理生成錯誤狀態的輸入數據,或它沖洗和重新提示用戶。

下面的代碼提供了做這三件事的許多方法之一。

#include<iostream> 
#include<limits> 
using namespace std; 
int main() 
{ 

    cout << "Enter an int: "; 
    int x = 0; 
    while(!(cin >> x)){ 
     cin.clear(); 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
     cout << "Invalid input. Try again: "; 
    } 
    cout << "You enterd: " << x << endl;   
} 

你可以只通過在一些大的價值cin.ignore像1000,它是可能出現的行爲如出一轍所有的實際目的。

你也可以在輸入嘗試之後測試cin並以這種方式處理它,例如 if(!cin){//清除錯誤}。

檢查出其他成員函數來處理流狀態的istream的參考:http://cplusplus.com/reference/iostream/istream/

+0

'cin.ignore'行正在沖洗它,對吧? – Jeff

+0

@Jeff是的,它沖洗緩衝區。你也可以在使用cin和getline的時候使用它,同時把輸入作爲cin離開緩衝區中的'\ n',並且不會刪除(我相信,不完全確定,也許它是cin.get),所以getline只會被分隔當它遇到左邊'\ n'時,它將附加到輸入緩衝區。 –