[英]Check if a char is a digit? (in C)
請注意我是新手
我以前用過isdigit()
function,但現在我有一個問題:
我需要檢查(例如)值為-46
的char
是否是數字。 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.