为什么isdigit总是返回false?

时间:2016-12-14 11:56:57

标签: c

我无法让isdigit工作。这是我的一些代码。

void input(int *array, int size) {
    int x;
    printf("Give me ten numbers. \n");
    for (int i = 0; i < size; i++) {
        do {
            printf("Array[%d]: ", i);
            scanf("%d", &x);
            scanf("%*[^\n]");
        } while (!isdigit(x));
        array[i] = x;
    }
}

这个程序的目的是用scanf从键盘读取一个整数(这没问题)。如果输入不是数字,则应重复while循环,直到用户给出一个数字。使用isdigit,您应该能够识别字符是否为整数。如果是整数则返回1,否则返回0。至少应该是这种情况。在此代码中,它始终返回0.

2 个答案:

答案 0 :(得分:1)

我无法理解你想做什么。首先,如果你需要一个charachter的整数,你应该保留值'0'所以

c-'0'.

然后,而不是使用scanf,如果你应该得到一个更好的getchar() 只是冲洗

 while(getchar()!='\n')
              ;

如果您不想使用正确的 scanf(“%d”,&amp; int_variable); ,您必须构建一个重建数字的函数,这意味着需要使用charachter,离开' 0'并在每个后面的charachter中乘以10。

答案 1 :(得分:0)

甜蜜的问题!! isdigit将参数作为单个字符(ASCII值)并确定该字符是否为数字。 [因此,它适用于信号数字]。

首先,因为isdigit将参数作为一个字符,如果你将数字作为参数传递,那么它会说“不,它不是数字”。您应该传递单位数的ASCII值作为参数 isdigit

我的意思是'1'!= 1

'1'等于1 +'0',它是字符'1'的ASCII值。

解决方案1:[它适用于单个数字]

void input(int *array, int size) {
    printf("Give me ten numbers. \n");
    for (int i = 0; i < size; i++) {
        int x;
        do {
            x = 'a'; //bcz if user enter a character, scanf will not able to take the value, so, x will hold the previous value
            printf("Array[%d]: ", i);
            scanf("%d", &x);
            scanf("%*[^\n]"); // fflush does not work on Macs. This is an alternative. [I don't know about the line, I copied from you.]
        } while (!isdigit(x+'0')); //converting the value to character

        array[i] = x;
    }
}

解决方案2 :(对于专业人士):p单行代码:)

void input(int *array, int size) {
    printf("Give me ten numbers. \n");
    for (int i = 0; i < size; i++) {
        while( printf("array[%d] = ",i) && !scanf("%d",&array[i]) && !scanf("%*[^\n]")); // it will give same result.
    }
}