2016-10-03 107 views
0

我寫了這個簡短的代碼來測試我的isdigit功能的認識:(您的輸入不是一個數)爲什麼Isdigit函數不能正常工作?

int inChar; 
printf("enter input:"); 
scanf(" %d", &inChar); 

if (isdigit(inChar)) 
    printf("Your input was a number"); 
else 
    printf("Your input was not a number.\n"); 

當我測試這個程序,我輸入一個數字,C返回else語句。所以,無論我輸入一個數字還是一個字母,程序都會返回else語句。

這是爲什麼呢?

+1

isdigit適用於char類型,而不是int。使用%c讀取 – stark

+0

C庫函數void isdigit(int c)檢查傳遞的字符是否爲十進制數字字符。 –

+0

@stark詳細信息:'isdigit(int)'接受一個'int'參數,並且在'[0 ... UCHAR_MAX]'和'EOF'範圍內工作。如果傳遞給'isdigit()'並且是負數(而不是'EOF'),則通過'「%c」'讀取的值爲UB。 – chux

回答

2

isdigit()檢查是否這是通過將字符值的unsigned char傳遞給它一個單個字符。 所以,你不能直接傳遞任何int值,並期望它的工作。

isdigit()說:

isdigit() 
      checks for a digit (0 through 9). 

要檢查單個數字,你可以修改:

char inChar; 
printf("enter input:"); 
scanf(" %c", &inChar); 

if (isdigit((unsigned char)inChar)) { 
    printf("Your input was a number"); 
} 
else { 
printf("Your input was not a number.\n"); 
} 

如果你有一個數組(包含數字的字符串),那麼你可以使用一個循環。

+3

你可以傳遞一個int,'isdigit'實際上需要一個'int'類型。問題是用'%d'讀取的數字給出的是數值,而不是ASCII值。 – Lundin

+2

由於原型具有它,所以直接傳遞一個int是有效的。但isdigit()要求該值可以用無符號字符表示。因此,作爲將其轉換爲無符號字符所需的一般化解決方案。 (否則,必須確保通過的值符合要求)。所以,是的,你是對的(但有警告)。 – usr

+0

詳細信息:「isdigit()」要求值可以用'unsigned char'「或'EOF'表示。 – chux

2

該功能的目的是分類字符(如'3')。在使用%d讀取的東西上運行它沒有任何意義。

您應該使用%c來閱讀單個char。請記住檢查閱讀是否成功。

1

C庫函數void isdigit(int c)檢查傳遞的字符是否爲十進制數字字符。

如果您想不好用int嘗試它,你可以通過這種方式

int inChar = '2'; 

下面的代碼給了預期的結果初始化。

int main() 
{ 
    char inChar; 
    printf("enter input:"); 
    scanf(" %c", &inChar); 
    if (isdigit(inChar)) 
     printf("Your input was a number. \n"); 
    else 
     printf("Your input was not a number.\n"); 
    return 0; 
} 

輸出:

vinay-1> ./a.out 
enter input:1 
Your input was a number 
+0

現在可以,您可以刪除所有評論,我會在幾分鐘內刪除此評論。 –

0

即使isdigit的格式

int isdigit(int c); // 7.4.1.5 

它實際上需要一個字符。如:符號表中的值。

如果您閱讀intscanf("%d"),則會得到原始整數值,例如1。但isdigit將需要符號值'1',這是大多數符號表中的原始值49。 isdigit的全部用途是檢查輸入是否是ASCII碼。

要解決這個問題,最好使用字符類型。或者,通過isdigit(inChar+'0')將原始值轉換爲符號表值。

+1

如何用'isdigit(inChar +'0')'溢出'unsigned char'的值?這不是UB嗎? –

+0

@AndrewHenle你的例子中沒有溢出。你的意思是,如果'inChar'已經包含值'0'?這顯然是一個錯誤。關鍵是要真正知道你在做什麼。 – Lundin

+1

如果用戶輸入「-151235」會怎麼樣?向其中添加'0'會產生一個不能表示爲'unsigned char'的值,因此每**調用UB 7.4字符處理' **:*在任何情況下,參數都是int ',其值可以表示爲 'unsigned char'或者等於宏'EOF'的值。如果 參數具有任何其他值,則行爲未定義。* –