2013-10-04 47 views
4

你好,我想檢查我的程序,如果用戶,而不是鍵入一個數字,如果他鍵入的東西,不是一個數字。isdigit()總是通過檢查

,所以我做了這個功能

void ValidationController::cinError(int *variable){ 

    if(!isdigit(*variable)){ 
     cin.clear(); 
     cin.ignore(256, '\n'); 
     cout <<*variable<<endl; 
     *variable=0; 
     cout <<*variable<<endl; 
    } 
} 

我調用該函數是這樣的:

int more; 
cin >>more; 
cinError(&more); 

所以我的問題是,每次我給一個數字,它就像我didn't.It去在裏面如果使變量等於零。我在這裏失蹤了什麼?

+3

[isdigit](http://linux.die.net/man/3/isdigit)對來自char *'數組的字符代碼進行操作。如果你已經有一個'int'變量,它會自動成爲一個數字,但它的值可能不會是單個數字的字符代碼。你期望'cinError'做什麼?沒有可能的輸入到一個不是數字的'int'的函數。 – simonc

+0

我期望測試用戶的輸入是否是一個數字,如果這不是真正的設置從cin設置的變量等於0否則保留該變量,因爲它是 – kyrpav

+2

然後,您不能讀取一個整數。一個字符串將是一個更好的選擇。 – drescherjm

回答

8

撇開您錯誤地使用isdigit的事實,無論如何檢查isdigit已經太晚了,因爲您正在閱讀int。在這種情況下,它是流的>>運算符查找數字,而不是您的代碼。

如果你想驗證用戶輸入,將數據讀入一個string,然後用它的成分isdigit,像這樣:

string numString; 
getline(cin, numString); 
for (int i = 0 ; i != numString.length() ; i++) { 
    if (!isdigit((unsigned char)numString[i])) { 
     cerr << "You entered a non-digit in a number: " << numString[i] << endl; 
    } 
} 
// Convert your validated string to `int` 
+0

但是別忘了用'char'調用'isdigit'是未定義的行爲;你必須首先轉換爲'unsigned char'。 (坦率地說,我會使用'std :: find_if'而不是你的循環。) –

+0

@JamesKanze這是一個公平點,謝謝你糾正這一點!我也會使用'std :: find_if',但我認爲這樣做會在他的「學習曲線」的這一點上過分地混淆OP。 – dasblinkenlight

+0

以及我讀了isdigit,我認爲它會讀取存儲在int中的字符,並測試字符代碼是否是數字。可能是我誤解了某些東西。感謝您的解決方案。 – kyrpav

2

檢查意見爲您isdigit問題

返回解決方案,如何處理異常? (我寧願使用dasblinkenlight的解決方案)

cin.exceptions(ios_base::failbit); 
    int more; 
    try 
    { 
    cin >> more; 
    if (!isspace(cin.get())) 
     /* non-numeric, non-whitespace character found 
     at end of input string */ 
     cout << "Error" << endl; 
    else 
     cout << "Correct" << endl; 
    } 
    catch(ios_base::failure& e) 
    {   
    /* non-numeric or non-whitespace character found      
    at beginning */ 
    cout << "Error" << endl; 
    }