簡體   English   中英

檢查字符是否為數字? (在 C 中)

[英]Check if a char is a digit? (in C)

請注意我是新手

我以前用過isdigit() function,但現在我有一個問題:

我需要檢查(例如)值為-46char是否是數字。 isdigit()似乎無法識別負數(可能正因為如此-在實際數字之前)。

是否有一行簡單的代碼可以與isdigit() function 具有相同的效果,但也可以檢測負數? (如 ASCII 表范圍或其他東西)

讓我進一步澄清一下:我有一個 char 類型數組: char A[20]我手動輸入每個值(示例):

A[0]= a
A[1]= b
A[2]= -46

現在從這 3 個(忽略剩余的 17 個 - 這只是一個示例)中,我需要檢查其中是否有任何一個是數字。 -46 是我正在搜索的數字(將其放入另一個數組中),所以我的問題是如何檢查 -46 是否“是數字”?

訣竅是isdigit函數不接受char類型的參數。 引用標准( N1570 7.4p1:

頭文件<ctype.h>聲明了幾個對字符進行分類和映射的函數。 在所有情況下,參數都是一個int ,其值應表示為unsigned char或等於宏EOF的值。 如果參數具有任何其他值,則行為是未定義的。

char類型可以是有符號的也可以是無符號的。 如果它是帶符號的(通常很常見),則它可以保存負值-並將除EOF以外的負值(通常為-1 )傳遞給isdigit<ctype.h>聲明的任何其他函數,導致未定義的行為。

解決方案是在將參數傳遞給isdigit之前,將其轉換為unsigned char

char c = -46;
if (isdigit((unsigned char)c) {
    puts("It's a digit (?)");
}
else {
    puts("It's not a digit");
}

是的,這確實像您認為的那樣令人討厭和違反直覺。

isdigit()函數不檢查數字是否為數字,數字始終為數字,而是檢查數字是否為對應於數字值或更准確地對應於數字的字符的ASCII碼,即字符的字符跟隨集

0, 1, 2, 3, 4, 5, 6, 7, 8, 9

您可以嘗試為此目的使用strtol()

char *endptr;
char *number = "-46";

strtol(number, &endptr, 10);
if (*endptr == '\0') /* read the manual in the link to understand this please */
    printf("yes, it's a number!\n");
else
    printf("NO, `%s' is not a number!\n", number);

注意 :如果您閱讀了手冊或所使用的每個功能的標准規范,將會提高您的語言技能,我經常會看到標准庫中每個功能的誤用,主要是因為用戶沒有閱讀手冊。

這完美無缺

#include<stdio.h>
    int main(){
        char c ;
        scanf("%c",&c);
        printf("It is %d", (c>='0' && c<='9'));
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM