2015-02-07 69 views
0

我有這個程序:如何禁止包含非數字?

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
int i=0; 
float reader, tot = 0; 

while(i!=10) 
{ 
    cout << "Insert a number: " << endl; 
    cin >> reader; 

    if(cin) 
    { 
     tot += reader; 
     i++; 
    } 

    else 
    { 
     cout << "Error. Please retry." << endl; 
     cin.clear(); 
    } 
} 

cout << "Media: " << tot/i << endl; 

return 0; 
} 

在IF()我希望用戶在「讀者」變量只插入浮點值。 我想,如果用戶插入一個編號,程序繼續...否則程序應該重新問用戶插入正確的值。

如何做到這一點檢查輸入?我嘗試了TRY CATCH,但沒有奏效。

在此先感謝!

+0

在[此主題] [1]中提問此問題。看看他們的解決方案。 [1]:https://stackoverflow.com/questions/4654636/how-to-determine-if-a-string-is-a-number-with-c – bruestle2 2015-02-07 23:06:41

+0

@ bruestle2你應該認識到評論中的迷你減價與答案中的降價差異。我們也沒有_threads_,但在這裏有問題和答案。 – 2015-02-07 23:38:19

回答

0

你原來的計劃是罰款,除非你需要跳過壞輸入,當你得到一個錯誤。簡單地清除錯誤是不夠的:

#include <iostream> 
#include <string> 
#include <limits> // include this!!! 

using namespace std; 

int main() 
{ 
int i=0; 
float reader, tot = 0.0f; // tot needs to be float 

while(i!=10) 
{ 
    cout << "Insert a number: " << endl; 

    if(cin >> reader) 
    { 
     tot += reader; 
     i++; 
    } 
    else 
    { 
     cout << "Error. Please retry." << endl; 
     cin.clear(); 
     // Then you ned to skip past the bad input so you 
     // don't keep tripping the same error 
     cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    } 
} 

cout << "Media: " << tot/i << endl; 

return 0; 
} 

功能cin.ignore()忽略儘可能多的輸入字符可能直到結束行的字符'\n'。函數std::numeric_limits<std::streamsize>::max()告訴我們可以存儲在輸入緩衝區中的最大可能字符數。

如果是混淆的另一種方法,以跳過壞輸入是簡單地讀取直到下一個線成std::string

else 
    { 
     cout << "Error. Please retry." << endl; 
     cin.clear(); 
     // Then you need to skip past the bad input so you 
     // don't keep tripping the same error 
     std::string skip; 
     std::getline(cin, skip); // read the bad input into a string 
    } 
+0

OH FINE!有用!但是,你能解釋我cin.ignore(...)做了什麼嗎? – Michele 2015-02-08 10:04:29

+0

@Michele我加了一個關於'cin.ignore()'函數的解釋。我還添加了效率較低但可能更容易理解的備選方案。 – Galik 2015-02-08 11:07:01

2

只是檢查的operator>>結果: 「這怎麼辦檢查輸入」

if (cin >> reader) { 
    // user gave you a float 
    tot += reader; 
    i++; 
} 
else { 
    cout << "Error. Please retry." << endl; 

    // clear the error flag on cin, and skip 
    // to the next newline. 
    cin.clear(); 
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
} 
+0

這在技術上等同於'如果(CIN)'它的原代碼。 – 2015-02-07 23:06:28

+0

謝謝!但是,這樣一來,當我插入不正確的值(如字母)的程序打印「錯誤,請重試。」不斷! – Michele 2015-02-07 23:07:51

+0

@BartekBanachewicz完全相同,是的,但我認爲這樣更安全 - 保持條件和行動在一起。 – Barry 2015-02-07 23:08:07

3

它已經通過

cin >> reader; 

只有有效float值可以由用戶輸入保證。檢查有效性的方法是

if(cin >> reader) { 
    tot += reader; 
    i++; 
} 
else { 
    cout << "Error. Please retry." << endl; 
    cin.clear(); 
    std::string dummy; 
    cin >> dummy; // <<< Read invalid stuff up to next delimiter 
} 

這是fully working sample


「我試着用TRY CATCH,但沒有奏效。」

std::istream操作,設置std::istream::exceptions面具得到例外。

+1

或者更簡潔地說:'if(cin >> reader)'。另外,你通常會想'std;:cin.ignore(largenumber,'\ n')'忽略同一輸入行上的剩餘輸入。最後,如果狀態是'eof()'或'bad()',你不會再試。 +1 – sehe 2015-02-07 23:09:45

+0

呃...當我插入一個不正確的值(就像一封信),程序對我說:「錯誤,請重試。」不斷! – Michele 2015-02-07 23:18:10

+0

@Michele照顧'cin.clear();'! – 2015-02-07 23:19:21

相關問題