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

C语言代码for循环未执行 仅读取一次输入就打印输出如何解决

问题根因

代码的问题出在scanf的格式串匹配逻辑上:

  • 你使用的格式串"(%d+%d)x(%d-%d)"要求输入严格匹配括号、加号、小写x、减号的固定格式,第一次输入结束后按下的换行符会残留在输入缓冲区中,第二次进入循环调用scanf时,缓冲区第一个字符是换行符,和格式串要求的(匹配失败,scanf直接返回0,后续循环的scanf都会因同样的原因匹配失败,实际上循环完整执行了3次,只是后两次scanf没有触发输入等待逻辑,所以看起来只执行了一次输入就跳转输出。
修复方案

下面两个方案均可直接使用:

方案1:格式串前加空白符跳过前置空白

scanf格式串开头的空白符会自动匹配所有空格、换行、制表符等空白字符,直接跳过缓冲区残留的空白,修改成本最低:

#include<stdio.h>
        
int main(){
  int A[100], B[100], C[100], D[100];
  int r[100];
        
            
  for(int i = 0; i < 3; i++)
  {
      // 格式串开头加空格,自动跳过所有前置空白字符
      scanf(" (%d+%d)x(%d-%d)", &A[i], &B[i], &C[i], &D[i]);
      r[i] = (A[i]+B[i])*(C[i]-D[i]);
  }
            
  for(int k = 0; k < 3; k++)
  {
      printf("%d\n", r[k]);
  }
        
  return 0;
}

方案2:每次输入后清理缓冲区

每次scanf执行完成后,主动清空输入缓冲区的残留字符,避免影响下一次匹配,兼容性更好:

#include<stdio.h>
        
int main(){
  int A[100], B[100], C[100], D[100];
  int r[100];
  int ch;
        
            
  for(int i = 0; i < 3; i++)
  {
      scanf("(%d+%d)x(%d-%d)", &A[i], &B[i], &C[i], &D[i]);
      r[i] = (A[i]+B[i])*(C[i]-D[i]);
      // 循环读取缓冲区字符直到遇到换行或结束符
      while((ch = getchar()) != '\n' && ch != EOF);
  }
            
  for(int k = 0; k < 3; k++)
  {
      printf("%d\n", r[k]);
  }
        
  return 0;
}
输入注意事项

输入内容要严格匹配格式,示例输入为(1+2)x(3-4),不要漏写括号、加号、减号,不要把小写x写成大写X,否则仍会出现匹配失败的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:36:02