#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
有人可以帮我找出问题吗?
答案 0 :(得分:5)
问题在于运营商优先级。 c = peekchar() != EOF
被归为c = (peekchar() != EOF)
,因此c
为0
或1
,其中包含结果。
使用(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'
,如果没有,那么只会检查它是否为数字。