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

