请注意我是新手
我之前使用过isdigit()
功能,但现在我遇到了问题:
我需要检查(例如)值为char
的{{1}}是否为数字。 -46
似乎没有识别出负数(可能是因为在实际数字之前 - )。
是否有一行简单的代码可以与isdigit()
函数具有相同的效果,但是它也可以检测到负数? (比如ASCII表范围或其他)
让我进一步澄清一下:我有一个char类型数组:isdigit()
我手动输入每个值(例子):
char A[20]
现在从这3个(忽略剩下的17个 - 这只是一个例子),我需要检查这些是否是一个数字。 -46是我正在搜索的数字(把它放在另一个数组中),所以我的问题是如何检查-46"是否是数字"?
答案 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);
注意:如果您阅读了所使用的每个功能的手册或标准规范,您将提高您的语言技能,我经常会看到标准库中每个功能的误用,主要是因为用户没有阅读本手册。