2010-02-28 145 views
1

我已經得到了下面的一段代碼:C++ - 驗證正確的輸入類型

... 
int x = 0; 
int y = 0; 
cin >> x >> y; 
if (x == -1 && y == -1) { 
    cout << "exit!"; 
} 
else { 
    doSomething(); 
} 
... 

和它的作品,但只有當我進入2號。如果我要輸入一個字母,如'n',程序就會陷入無限循環。我如何檢查以確保用戶輸入了一個數字並避免無限循環?

+1

我不確定要了解您的問題。如果你想'n',它不起作用?最後'n'也是一個數字,所以很奇怪。 2sd認爲如果代碼中沒有循環,你怎麼能有一個無限循環? – 2010-02-28 03:11:17

+0

當我運行該程序時,我應該輸入由空格(x和y)分隔的2個數字,但如果要輸入其他任何內容(如字母),程序將進入無限循環。這就是爲什麼我試圖驗證輸入,以確保用戶輸入兩個數字,沒有別的。 – cornjuliox 2010-02-28 03:20:04

回答

4

一旦cin看到輸入數據和您要讀取的變量之間的類型不一致,它會進入「失敗」狀態。衝突的變量不會被更新。觀察:

2010-02-27 22:54:27 ~/tmp/ $ cat ju3.cpp 
#include <iostream> 
using namespace std; 
int main() { 
    int    x = 0; 
    int    y = 12345; 
    string   s, a; 

    printf("cin good? %d, reading...\n", cin.good()); 
    cin >> a >> x >> y >> s; 
    printf("a=%s, x=%d, y=%d, s=%s\n", a.c_str(), x, y, s.c_str()); 
    printf("... read, cin good? %d\n", cin.good()); 
    return 0; 
} 
2010-02-27 22:54:36 ~/tmp/ $ g++ ju3.cpp -o ju3 
2010-02-27 22:54:56 ~/tmp/ $ echo 1 2 3 4 | ./ju3 
cin good? 1, reading... 
a=1, x=2, y=3, s=4 
... read, cin good? 1 
2010-02-27 22:55:05 ~/tmp/ $ echo a x y z | ./ju3 
cin good? 1, reading... 
a=a, x=0, y=12345, s= 
... read, cin good? 0 

有兩種方法可以避免您所看到的問題。

  • 快速和骯髒的解決方案是檢查cin.good()而不是比較數字-1
  • 如果要使cin的行爲更加健壯,請讀入string而不是int s,然後手動驗證它們是否只包含數字字符。然後,您可以使用stringstream輕鬆地將字符串轉換爲數字。
+0

好的,所以我現在使用cin >> x >> y來讀入字符串而不是int,但是如何驗證字符串中只包含數字字符?字符串類沒有isdigit()函數,並且在字符串中的每個字母上循環,並嘗試調用isdigit(),該函數也不起作用。 – cornjuliox 2010-02-28 09:22:55

+0

就像尹竺說的那樣,看看ctype.h頭文件(或者C++的等價物,叫做cctype)。你需要分別檢查每個字母。如果你的代碼不能按照你期望的方式工作,請使用printf來找出原因! – 2010-02-28 17:47:01

0

輸入兩個字符串並使用ctype.h中的函數檢查輸入的有效性。