我正在使用以下代码。我希望输出为"是",但我得到"否。"我必须遗漏一些非常简单和基本的东西。
#include <stdio.h>
#include <ctype.h>
int main(void)
{
int n = 3;
if (isdigit(n))
{
printf("Yes\n");
}
else
{
printf("No\n");
}
return 0;
}
答案 0 :(得分:2)
isdigit()
需要一个字符代码,而您希望它接受一个普通数字
这些期望并不合适。
字符文字:
'0'
序号0x30 - 48 '1'
序号0x31 - 49 '2'
序号0x32 - 50 答案 1 :(得分:2)
isdigit
检查传递给它的字符是否为数字字符。因此,它的参数应该是char
类型或int
类型,这是一个字符的代码。
在这里,您将3
传递给isdigit
。在ASCII中,3
是字符ETX
(文本结尾)的代码,它是非数字字符。因此,isdigit(3)
会返回false
。
答案 2 :(得分:1)
'3'不是数字,这里是isdigit()
考虑它们的方式。将int n = 3
更改为int n = '3'
。例如,如果您的系统使用ASCII,3
是文本标记的结尾,而51
,相当于'3'
,则是实际字符3。
答案 3 :(得分:0)
isdigit
期待一个角色。如果传递的字符是数字,则返回非零。 3
是不可打印字符的ASCII值,即它不代表数字,这就是你的else
正文被执行的原因。
答案 4 :(得分:0)
man isdigit
:
These functions check whether c, which must have the value of an
unsigned char or EOF, falls into a certain character class according to
the current locale.
3是整数,而不是字符。实际上,3也是不是数字的字符的值。
答案 5 :(得分:0)
以下是函数isdigit
的实现:
int isdigit(char c)
{
return '0' <= c && c <= '9';
}
简单来说,函数isdigit
将char
参数作为输入:
如果输入表示ASCII格式的十进制数字,则该函数返回1.
如果输入不代表ASCII格式的十进制数字,则该函数返回0.
当您使用isdigit
参数调用函数int
时,该参数首先被截断为char
。这在您的示例中没有任何区别,因为3适合char
,因此不会因截断而丢失任何信息。但是,由于3不代表ASCII格式的任何十进制数字,因此isdigit(3)
的返回值为0.
总结以上内容:
isdigit('0')
的返回值为1。isdigit('1')
的返回值为1。isdigit('9')
的返回值为1。isdigit(...)
的返回值为0。你的错误可能源于'3' == 3
的假设。如果要检查int
变量是否存储单个十进制数值,则可以实现稍微不同的函数:
int isintdigit(int i)
{
return 0 <= i && i <= 9;
}
答案 6 :(得分:0)
字符串"\03\t\nABCabc123"
由12个字符组成。应用于isdigit()
函数时,前9个字符都返回false。最后3个都返回true;
#include <ctype.h>
#include <stdio.h>
int main(void) {
char data[] = "\03\t\nABCabc123";
// data[0] = 3;
char *ptr = data;
while (*ptr) {
printf("%4d --> %s\n", *ptr, isdigit((unsigned char)*ptr) ? "true" : "false");
ptr++;
}
return 0;
}