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
相关产品推荐
相关产品推荐

