C程序逐字符读取数字,给出错误的结果

时间:2018-03-27 09:14:18

标签: c

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

int peekchar() {
    int c;
    c = getchar();
    if (c != EOF) {
        ungetc(c, stdin);
    }   
    return c;
}

int readNumber(void) {
    int c;
    int accumulator = 0;
    while ((c = peekchar() != EOF) && isdigit(c)) {
       c = getchar();
       accumulator *= 10; 
       accumulator += c - '0';
    }   
    return accumulator;
}

int main() {
    int result = readNumber();
    printf("%d\n", result);
    return 0;
}

我正在尝试从stdin读取以十进制表示法写入的整数,直到第一个非数字。但它没有给出正确的结果:

M1508444:CProg sb054043$ gcc -g3 readNumber.c -o readNumber
M1508444:CProg sb054043$ ./readNumber 
123
0

有人可以帮我找出问题吗?

2 个答案:

答案 0 :(得分:5)

问题在于运营商优先级。 c = peekchar() != EOF被归为c = (peekchar() != EOF),因此c01,其中包含结果。

使用(c = peekchar()) != EOF进行修复。

或者,鉴于isdigit的{​​{1}}定义为0,您的循环条件可以简化为

EOF

答案 1 :(得分:0)

您好需要修改您的while循环,如下所示: -

 while ( (c = peekchar()) != EOF && isdigit(c)) {
   c = getchar();
   accumulator *= 10; 
   accumulator += c - '0';
}   

首先,您需要读取值并将其存储在变量c中,并且可以通过执行(c = peekchar())来实现。一旦c while loop中存储的值,您的EOF将首先检查它是WHERE MF.localization_id = 1 AND MF.start_date = '2018-03-05 12:00:00' ,如果没有,那么只会检查它是否为数字。