2016-10-18 78 views
1

我想檢查輸入是否有效,但是當我運行此代碼時,我發現它只檢查字符輸入。如果我輸入一個浮點數,它將採用它,並將使用像整數沒有小數部分。如何檢查輸入數字整數是不是浮動?

#inclide <iostream> 
using namespace std; 
... 
int n; 
cout << "Your input is: "<<endl; 
cin >> n; 
while (cin.fail()) { 
    cout << "Error. Number of elements must be integer. Try again: " << endl; 
    cin.clear(); 
    cin.ignore(256, '\n'); 
    cin >> n; 
} 
...   
     ` 

那麼,如何讓這段代碼看看輸入是否爲float?

+1

讀入作爲字符串和解析。 – NathanOliver

+0

你在問一個錯誤的問題,這個問題有一個後續問題:*「我如何觀察任何非數字輸入?」*您應該問的問題是:*「我如何確定,是否整個輸入是一個整數的一部分,並且[這個答案](http://stackoverflow.com/a/40119691/1889329)完全解決了這個問題。 – IInspectable

回答

0

下面的代碼應該能夠做你想做的事情:

#inclide <iostream> 
using namespace std; 
int n; 
cout << "Your input is: "<<endl; 
while (!(cin >> n) || cin.get() != '\n') { 
    cout << "Error. Number of elements must be integer. Try again: " << endl; 
    cin.clear(); 
    cin.ignore(256, '\n'); 
} 

該程序詢問用戶是否任一會出現以下情況,重新輸入的整數:

  1. 如果程序是無法提取從std::cin流的整數。 (例如,當用戶輸入字符或字符串時)
  2. 如果在成功提取整數之後,std::cin中的下一個字符不是新行'\n'字符。 (例如,當被輸入帶小數點像1.1數字,或者輸入一個整數,其後像1a一個字符時。)
1

您可以嘗試使用std::istringstream將輸入字符串轉換爲int。如果成功,則檢查eof()(忽略空格後)以查看整個輸入是否在轉換爲int時被消耗。如果整個輸入被消耗,那麼它是有效的int

東西有點像這樣:

int input_int() 
{ 
    int i; 

    // get the input 
    for(std::string line; std::getline(std::cin, line);) 
    { 
     // try to convert the input to an int 
     // if at eof() all of the input was converted - must be an int 
     if((std::istringstream(line) >> i >> std::ws).eof()) 
      break; 

     // try again 
     std::cout << "Not an integer please try again: " << std::flush; 
    } 

    return i; 
} 

int main() 
{ 
    std::cout << "Enter an integer: " << std::flush; 

    std::cout << "i: " << input_int() << '\n'; 
} 
-1

大廈Raindrop7的解決方案,下面是完整的代碼,你需要的東西:

#include <cstdio> 
#include <iostream> 
#include <cmath> 
using namespace std; 

int main() 
{ 
    double m; 
    cout << "Your input is: "<<endl; 
    cin >> m; 
    while (cin.fail() || (m-floor(m))) 
    { 
     cout << "Error. Nubmer of elements has to be integer. Try again: " << endl; 
     cin.clear(); 
     cin.ignore(256, '\n'); 
     cin >> m; 
    } 
    int n = (int)m; 
    return 0; 
} 

下面是一個示例輸出:

Your input is: 
2.7 
Error. Nubmer of elements has to be integer. Try again: 
erer 
Error. Nubmer of elements has to be integer. Try again: 
2 
+0

這絕對是巧合,會產生誤報。浮點表示是不精確的,'operator >>'失去了信息,如果事情變壞,它會將浮點值變成可以用整數值表示的東西,然後進行測試...... – IInspectable

+0

@IInspectable給出一個例子證明你說的是什麼 – Raindrop7

+0

@ Raindrop7:看看[std :: nextafter,std :: nexttoward](http://en.cppreference.com/w/cpp/numeric/math/nextafter),並生成任意的例子來證明這一事實。 (提示:從任何整數開始,調用'std :: next'指向一個更高的值,並輸入剛好低於這兩個值的中點的值。) – IInspectable