我已經得到了下面的一段代碼:C++ - 驗證正確的輸入類型
...
int x = 0;
int y = 0;
cin >> x >> y;
if (x == -1 && y == -1) {
cout << "exit!";
}
else {
doSomething();
}
...
和它的作品,但只有當我進入2號。如果我要輸入一個字母,如'n',程序就會陷入無限循環。我如何檢查以確保用戶輸入了一個數字並避免無限循環?
我已經得到了下面的一段代碼:C++ - 驗證正確的輸入類型
...
int x = 0;
int y = 0;
cin >> x >> y;
if (x == -1 && y == -1) {
cout << "exit!";
}
else {
doSomething();
}
...
和它的作品,但只有當我進入2號。如果我要輸入一個字母,如'n',程序就會陷入無限循環。我如何檢查以確保用戶輸入了一個數字並避免無限循環?
一旦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
輕鬆地將字符串轉換爲數字。好的,所以我現在使用cin >> x >> y來讀入字符串而不是int,但是如何驗證字符串中只包含數字字符?字符串類沒有isdigit()函數,並且在字符串中的每個字母上循環,並嘗試調用isdigit(),該函數也不起作用。 – cornjuliox 2010-02-28 09:22:55
就像尹竺說的那樣,看看ctype.h頭文件(或者C++的等價物,叫做cctype)。你需要分別檢查每個字母。如果你的代碼不能按照你期望的方式工作,請使用printf來找出原因! – 2010-02-28 17:47:01
輸入兩個字符串並使用ctype.h
中的函數檢查輸入的有效性。
我不確定要了解您的問題。如果你想'n',它不起作用?最後'n'也是一個數字,所以很奇怪。 2sd認爲如果代碼中沒有循環,你怎麼能有一個無限循環? – 2010-02-28 03:11:17
當我運行該程序時,我應該輸入由空格(x和y)分隔的2個數字,但如果要輸入其他任何內容(如字母),程序將進入無限循環。這就是爲什麼我試圖驗證輸入,以確保用戶輸入兩個數字,沒有別的。 – cornjuliox 2010-02-28 03:20:04