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

C语言代码仅读取一次输入却重复输出三次相同结果的问题排查

问题原因与解决

你的代码核心问题是**scanf的格式字符串没有处理输入中的换行符**,导致后续循环无法正确读取新的输入行,变量值未更新,最终输出重复结果。

具体原因分析

  • 第一次输入(3+4)x(1-3)并回车后,输入缓冲区中残留了换行符\n。
  • 第二次循环时,scanf尝试匹配格式开头的(,但缓冲区第一个字符是\n,匹配失败,不会更新a、b、c、d的值,result[1]只能复用第一次的计算结果。
  • 第三次循环同理,匹配依然失败,result[2]也重复第一次的结果。

解决方案

有两种简单的修复方式:

方法1:在格式字符串开头添加空格

scanf中的空格会匹配任意数量的空白字符(包括换行、空格、制表符),自动跳过缓冲区残留的换行符:

#include <stdio.h>

int main(){
    int a, b, c, d, result[3];
    
    for(int i=0; i<3; i++){
        scanf(" (%d+%d)x(%d-%d)", &a, &b, &c, &d); // 开头加空格跳过空白符
        result[i] = (a+b)*(c-d);
    }
    
    printf("%d %d %d\n", result[0], result[1], result[2]);
    
    return 0;
}

方法2:手动清空输入缓冲区

每次scanf后,用循环读取缓冲区直到换行符,避免残留字符影响下一次读取:

#include <stdio.h>

int main(){
    int a, b, c, d, result[3];
    
    for(int i=0; i<3; i++){
        scanf("(%d+%d)x(%d-%d)", &a, &b, &c, &d);
        result[i] = (a+b)*(c-d);
        // 清空缓冲区残留的换行符
        while(getchar() != '\n');
    }
    
    printf("%d %d %d\n", result[0], result[1], result[2]);
    
    return 0;
}

验证效果

使用预期输入测试,两种方法都能输出正确结果:

-14 11 32

内容的提问来源于stack exchange,提问作者Coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:34:53