2009-02-05 273 views

回答

2
double i; 

//Reading the value 
cin >> i; 

//Numeric input validation 
if(!cin.eof()) 
{ 
    peeked = cin.peek(); 
    if(peeked == 10 && cin.good()) 
    { 
      //Good! 
      count << "i is a decimal"; 
     } 
     else 
     { 
      count << "i is not a decimal"; 
     cin.clear(); 
     cin >> discard; 
     } 
} 

這也給出了一個錯誤消息,其中輸入-1a2.0避免了只給-1分配給i。

11

如果cin的支持變量是一個數字,而所提供的字符串不是數字,則返回值是假的,所以你需要一個循環:

int someVal; 

while(!(cin >> someVal)) { 
    cin.reset(); 
    cout << "Invalid value, try again."; 
} 
+8

play.cpp:10:錯誤: '結構的std :: istream的' 沒有名爲成員 '復位' – Ziggy 2011-09-22 23:12:54

+5

並且還 - 如果我更換復位()與clear(),你的意思與否 - 當給出一個非數字輸入時,它會導致無限循環。 – Notinlist 2011-10-10 07:46:53

-5

喜歡的東西:

double a; 
cin >> a; 

應該讀取您簽名的「十進制」罰款。

您需要一個循環和一些代碼來確保它以合理的方式處理無效輸入。

祝你好運!

1

cin's >>操作符通過一次讀取一個字符來工作,直到遇到空格爲止。這將誹謗整個字符串-1a2.0,這顯然不是一個數字,所以操作失敗。看起來你實際上有三個字段,-1,a和2.0。如果你用空格分隔數據,cin將能夠毫無問題地讀取每一個數據。請記住閱讀第二場的char

0

我不想粗魯。我只是想分享我提供的解決方案,我認爲它更強大,並允許更好的輸入驗證。

請參考:My Solution to Input Validation

0

我試過很多方法從使用>>運營商用戶閱讀整數輸入,但在這種或那種方式我所有的實驗都失敗了。

現在我認爲getline()功能(不與std::istream相同名稱的方法)和strtol()功能從包括cstdlib是這個問題的唯一可預測的一致的解決方案。如果有人證明我錯了,我將不勝感激。這是像我使用的一個:

#include <iostream> 
#include <cstdlib> 

// @arg prompt The question to ask. Will be used again on failure. 
int GetInt(const char* prompt = "? ") 
{ 
    using namespace std; // *1 
    while(true) 
    { 
     cout << prompt; 
     string s; 
     getline(cin,s); 
     char *endp = 0; 
     int ret = strtol(s.c_str(),&endp,10); 
     if(endp!=s.c_str() && !*endp) 
      return ret; 
    } 
} 
  • * 1:配售using namespace whatever;全球範圍可能引發斷「團結構建」(!谷歌)的大型項目,所以應儘量避免。儘量不要使用這種方式,即使在較小的項目中!
  • 從文件中讀取整數是一個非常不同的問題。如果解決得當,勞爾·羅阿的方法可以做得很好。我也建議不應該容忍錯誤的輸入文件,但它確實取決於應用程序。
  • 請注意,在cin的同一程序中使用>>getline()會導致一些問題。只使用其中一個,或谷歌知道如何處理這個問題(不是太難)。
1

從頂端回答herethis網站相結合的技術,我得到

輸入。ħ

#include <ios> // Provides ios_base::failure 
#include <iostream> // Provides cin 

template <typename T> 
T getValidatedInput() 
{ 
    // Get input of type T 
    T result; 
    cin >> result; 

    // Check if the failbit has been set, meaning the beginning of the input 
    // was not type T. Also make sure the result is the only thing in the input 
    // stream, otherwise things like 2b would be a valid int. 
    if (cin.fail() || cin.get() != '\n') 
    { 
     // Set the error state flag back to goodbit. If you need to get the input 
     // again (e.g. this is in a while loop), this is essential. Otherwise, the 
     // failbit will stay set. 
     cin.clear(); 

     // Clear the input stream using and empty while loop. 
     while (cin.get() != '\n') 
      ; 

     // Throw an exception. Allows the caller to handle it any way you see fit 
     // (exit, ask for input again, etc.) 
     throw ios_base::failure("Invalid input."); 
    } 

    return result; 
} 

用法

inputtest.cpp

#include <cstdlib> // Provides EXIT_SUCCESS 
#include <iostream> // Provides cout, cerr, endl 

#include "input.h" // Provides getValidatedInput<T>() 

int main() 
{ 
    using namespace std; 

    int input; 

    while (true) 
    { 
     cout << "Enter an integer: "; 

     try 
     { 
      input = getValidatedInput<int>(); 
     } 
     catch (exception e) 
     { 
      cerr << e.what() << endl; 
      continue; 
     } 

     break; 
    } 

    cout << "You entered: " << input << endl; 

    return EXIT_SUCCESS; 
} 

樣品運行

輸入一個整數:一個
輸入無效。
輸入整數:2b
輸入無效。
輸入一個整數:
您輸入:3