2016-10-03 60 views
0

我写了这个简短的代码来测试我的isdigit功能的认识:(您的输入不是一个数)为什么Isdigit函数不能正常工作?

int inChar; 
printf("enter input:"); 
scanf(" %d", &inChar); 

if (isdigit(inChar)) 
    printf("Your input was a number"); 
else 
    printf("Your input was not a number.\n"); 

当我测试这个程序,我输入一个数字,C返回else语句。所以,无论我输入一个数字还是一个字母,程序都会返回else语句。

这是为什么呢?

+1

isdigit适用于char类型,而不是int。使用%c读取 – stark

+0

C库函数void isdigit(int c)检查传递的字符是否为十进制数字字符。 –

+0

@stark详细信息:'isdigit(int)'接受一个'int'参数,并且在'[0 ... UCHAR_MAX]'和'EOF'范围内工作。如果传递给'isdigit()'并且是负数(而不是'EOF'),则通过'“%c”'读取的值为UB。 – chux

回答

2

isdigit()检查是否这是通过将字符值的unsigned char传递给它一个单个字符。 所以,你不能直接传递任何int值,并期望它的工作。

isdigit()说:

isdigit() 
      checks for a digit (0 through 9). 

要检查单个数字,你可以修改:

char inChar; 
printf("enter input:"); 
scanf(" %c", &inChar); 

if (isdigit((unsigned char)inChar)) { 
    printf("Your input was a number"); 
} 
else { 
printf("Your input was not a number.\n"); 
} 

如果你有一个数组(包含数字的字符串),那么你可以使用一个循环。

+3

你可以传递一个int,'isdigit'实际上需要一个'int'类型。问题是用'%d'读取的数字给出的是数值,而不是ASCII值。 – Lundin

+2

由于原型具有它,所以直接传递一个int是有效的。但isdigit()要求该值可以用无符号字符表示。因此,作为将其转换为无符号字符所需的一般化解决方案。 (否则,必须确保通过的值符合要求)。所以,是的,你是对的(但有警告)。 – usr

+0

详细信息:“isdigit()”要求值可以用'unsigned char'“或'EOF'表示。 – chux

2

该功能的目的是分类字符(如'3')。在使用%d读取的东西上运行它没有任何意义。

您应该使用%c来阅读单个char。请记住检查阅读是否成功。

1

C库函数void isdigit(int c)检查传递的字符是否为十进制数字字符。

如果您想不好用int尝试它,你可以通过这种方式

int inChar = '2'; 

下面的代码给了预期的结果初始化。

int main() 
{ 
    char inChar; 
    printf("enter input:"); 
    scanf(" %c", &inChar); 
    if (isdigit(inChar)) 
     printf("Your input was a number. \n"); 
    else 
     printf("Your input was not a number.\n"); 
    return 0; 
} 

输出:

vinay-1> ./a.out 
enter input:1 
Your input was a number 
+0

现在可以,您可以删除所有评论,我会在几分钟内删除此评论。 –

0

即使isdigit的格式

int isdigit(int c); // 7.4.1.5 

它实际上需要一个字符。如:符号表中的值。

如果您阅读intscanf("%d"),则会得到原始整数值,例如1。但isdigit将需要符号值'1',这是大多数符号表中的原始值49。 isdigit的全部用途是检查输入是否是ASCII码。

要解决这个问题,最好使用字符类型。或者,通过isdigit(inChar+'0')将原始值转换为符号表值。

+1

如何用'isdigit(inChar +'0')'溢出'unsigned char'的值?这不是UB吗? –

+0

@AndrewHenle你的例子中没有溢出。你的意思是,如果'inChar'已经包含值'0'?这显然是一个错误。关键是要真正知道你在做什么。 – Lundin

+1

如果用户输入“-151235”会怎么样?向其中添加'0'会产生一个不能表示为'unsigned char'的值,因此每**调用UB 7.4字符处理' **:*在任何情况下,参数都是int ',其值可以表示为 'unsigned char'或者等于宏'EOF'的值。如果 参数具有任何其他值,则行为未定义。* –

相关问题