使用isdigit(x)的意外结果

时间:2014-04-26 15:23:20

标签: c

我正在使用以下代码。我希望输出为"是",但我得到"否。"我必须遗漏一些非常简单和基本的东西。

#include <stdio.h>
#include <ctype.h>

int main(void)
{
    int n = 3;

    if (isdigit(n))
    {
        printf("Yes\n");
    }

    else
    {
        printf("No\n");
    }

    return 0;
}

7 个答案:

答案 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';
}

简单来说,函数isdigitchar参数作为输入:

  • 如果输入表示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;
}