检查字符是否是数字? (在C中)

时间:2015-03-28 18:40:52

标签: c

请注意我是新手

我之前使用过isdigit()功能,但现在我遇到了问题:

我需要检查(例如)值为char的{​​{1}}是否为数字。 -46似乎没有识别出负数(可能是因为在实际数字之前 - )。

是否有一行简单的代码可以与isdigit()函数具有相同的效果,但是它也可以检测到负数? (比如ASCII表范围或其他)

让我进一步澄清一下:我有一个char类型数组:isdigit()我手动输入每个值(例子):

char A[20]

现在从这3个(忽略剩下的17个 - 这只是一个例子),我需要检查这些是否是一个数字。 -46是我正在搜索的数字(把它放在另一个数组中),所以我的问题是如何检查-46"是否是数字"?

2 个答案:

答案 0 :(得分:7)

诀窍是isdigit函数不接受char类型的参数。引用标准(N1570 7.4p1:

  

标题 <ctype.h> 声明了几个有用的功能   分类和映射字符。在所有情况下,论证都是一个    int ,其值应表示为 unsigned char 或等于宏 EOF的值即可。如果   参数有任何其他值,行为未定义。

char类型可以是已签名或未签名。如果它已签名(通常是这样),则它可以保留负值 - 并将EOF以外的负值(通常为-1)传递给isdigit,或<ctype.h>中声明的任何其他函数,导致未定义的行为。

解决方案是将参数转换为unsigned char,然后再将其传递给isdigit

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

是的,这和你想象的一样令人讨厌和违反直觉。

答案 1 :(得分:3)

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);

注意:如果您阅读了所使用的每个功能的手册或标准规范,您将提高您的语言技能,我经常会看到标准库中每个功能的误用,主要是因为用户没有阅读本手册。