逐字符读取十进制整数的C程序返回错误结果的问题求助
问题排查与修复方案
嘿,一眼就瞅出问题所在了——是运算符优先级的坑把你给绊倒啦!
先看你readNumber函数里的while循环条件:
while ((c = peekchar() != EOF) && isdigit(c))
这里的!=优先级比=高,所以代码实际执行顺序是先判断peekchar() != EOF,得到一个0或1的布尔值,再把这个值塞给c。这就导致你后面用isdigit(c)判断的时候,c根本不是从输入读来的字符,自然没法正确识别数字,程序结果肯定不对。
具体修复步骤
修正括号位置:把
c = peekchar()用括号单独括起来,确保先完成赋值,再和EOF做比较:while ((c = peekchar()) != EOF && isdigit(c))这样
c就能正确拿到peek到的字符,后续的数字判断和累加逻辑才能正常工作。可选的代码简化:你的
peekchar函数逻辑没问题,但可以稍微精简一下写法,让代码更清爽:int peekchar() { int c = getchar(); if (c != EOF) ungetc(c, stdin); return c; }
修正后的完整代码
#include<stdio.h> #include<ctype.h> int peekchar() { int 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; }
测试效果
比如输入456xyz,程序会正确读取456并输出;如果输入!789这种非数字开头的内容,程序返回0,完全符合你“读取到第一个非数字字符为止”的需求。
内容的提问来源于stack exchange,提问作者Swarnagowri
相关产品推荐
相关产品推荐

