You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

逐字符读取十进制整数的C程序返回错误结果的问题求助

问题排查与修复方案

嘿,一眼就瞅出问题所在了——是运算符优先级的坑把你给绊倒啦!

先看你readNumber函数里的while循环条件:

while ((c = peekchar() != EOF) && isdigit(c))

这里的!=优先级比=高,所以代码实际执行顺序是先判断peekchar() != EOF,得到一个0或1的布尔值,再把这个值塞给c。这就导致你后面用isdigit(c)判断的时候,c根本不是从输入读来的字符,自然没法正确识别数字,程序结果肯定不对。

具体修复步骤

  1. 修正括号位置:把c = peekchar()用括号单独括起来,确保先完成赋值,再和EOF做比较:

    while ((c = peekchar()) != EOF && isdigit(c))
    

    这样c就能正确拿到peek到的字符,后续的数字判断和累加逻辑才能正常工作。

  2. 可选的代码简化:你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:19:09