2010-06-03 53 views
7

我遇到了isdigit問題。我讀了文檔,但是當我輸出數字(9)時,我得到一個0.我不應該得到1嗎?isdigit()C++,可能是簡單的問題,但卡住了

#include <iostream> 
#include <cctype> 
#include "Point.h" 

int main() 
{ 
    std::cout << isdigit(9) << isdigit(1.2) << isdigit('c'); 
    // create <int>i and <double>j Points 
    Point<int> i(5, 4); 
    Point<double> *j = new Point<double> (5.2, 3.3); 

    // display i and j 
    std::cout << "Point i (5, 4): " << i << '\n'; 
    std::cout << "Point j (5.2, 3.3): " << *j << '\n'; 

    // Note: need to use explicit declaration for classes 
    Point<int> k; 
    std::cout << "Enter Point data (e.g. number, enter, number, enter): " << '\n' 
     << "If data is valid for point, will print out new point. If not, will not " 
     << "print out anything."; 
    std::cin >> k; 
    std::cout << k; 

    delete j; 
} 

回答

16

isdigit()是用於測試的字符是否是一個數字字符。

如果您將其稱爲isdigit('9'),它將返回非零值。

在ASCII字符集(您可能使用的)中,9代表水平製表符,它不是數字。


由於您使用的I/O流的輸入,就不需要使用isdigit()驗證輸入。如果從流中讀取的數據無效,則提取(即std::cin >> k)將失敗,因此如果您期望讀取int並且用戶輸入「asdf」,則提取將失敗。

如果提取失敗,則會設置流上的失敗位。您可以測試,這和處理錯誤:

std::cin >> k; 
if (std::cin) 
{ 
    // extraction succeeded; use the k 
} 
else 
{ 
    // extraction failed; do error handling 
} 

注意,提取本身也返回流,這樣就可以縮短前兩行是簡單的:

if (std::cin >> k) 

和結果是相同的。

+0

並不意味着要竊取你的答案。我正在關閉Google,並沒有看到回覆。 – 2010-06-03 23:52:43

+1

'isdigit',而不是'isDigit';) – tzaman 2010-06-03 23:53:16

+0

那麼,如何驗證userInput,因爲我需要單引號在parantheses? – Crystal 2010-06-03 23:54:18

0

isdigit()適用於當前正在傳遞的字符,而不是ascii值。嘗試使用isdigit('9')

+0

函數是'isdigit'(小寫'd'),可以說isdigit'可以很好地處理ASCII值。 – dreamlax 2010-06-04 00:46:13

+0

修正了這個問題。它在ASCII上工作得很好,但是你必須知道你使用的是ASCII而不是傳遞一個字符。我認爲他試圖測試'9'而不是'TAB' – 2010-06-04 01:01:55

5

isdigit()需要int這是字符的表示。字符9是(假設你使用ASCII)TAB字符。字符0x39或「9」( 9)是表示數字9

的數字字符是整數代碼0x30至在ASCII 0x39(或48至57)的實際的字符 - I重申的是,由於ASCII是不ISO C標準的要求。因此,下面的代碼:

if ((c >= 0x30) && (c <= 0x39)) 

這我以前見過,不具有通用性的好主意,因爲存在使用EBCDIC在幕後的至少一個實現 - isdigit是在所有情況下的最佳選擇。

+1

+1,注意到正確的函數簽名,證明了'char'和'int'的互換性。 – 2010-06-03 23:57:04

+3

然而,標準確實要求數字的字符值必須是從0到9的順序。因此,'if((c> ='0')&&(c <='9'))'將起作用。對於字母字符,*不是*真。 – dreamlax 2010-06-04 00:54:47

+0

IIRC'isdigit('1')'也可以返回true - char也可以是ASCI的超集。 – MSalters 2010-06-04 08:28:21