C语言for循环仅首次scanf生效,后续scanf被跳过问题咨询
解决你的for循环中scanf跳过问题
嘿,我来帮你搞定这个输入跳过的问题——这是C语言输入处理里的典型坑,咱们一步步拆解修复:
问题根源拆解
你的代码里有三个核心问题导致了输入被跳过的现象:
fflush(stdin)是未定义行为
C标准明确规定fflush只能用于输出流,对stdin调用它的结果是不确定的,不同编译器表现不一样,这根本不是可靠的清空输入缓冲区的方法。字符串输入的格式符用错了
你用scanf(" %c", &b[i].name);读书名,但name是char[20]数组,%c只能读单个字符,而且b[i].name本身就是数组的首地址,不需要加&,这里应该用%s来读取字符串。循环起始索引出错
你的循环是for (i = 1; i < c; i++),这会直接跳过第0个书籍元素,如果用户输入c=1,循环根本不会执行,应该从i=0开始遍历所有元素。
修正后的完整代码
#include <stdio.h> int main() { int c = 0; int i; struct book { char name[20]; float price; int page; }; printf("Enter number of books to add: "); scanf("%d", &c); // 手动清空输入缓冲区的换行符,避免影响后续输入 while (getchar() != '\n'); struct book b[c]; // 注:变长数组是C99特性,部分编译器需开启支持 printf("\nBook details:\n"); // 从i=0开始遍历,给用户显示的序号用i+1更符合习惯 for (i = 0; i < c; i++) { printf("\nEnter name for book %d: ", i+1); // 用%19s限制读取长度,防止缓冲区溢出 scanf("%19s", b[i].name); printf("Enter price for book %d: ", i+1); scanf("%f", &b[i].price); printf("Enter page count for book %d: ", i+1); scanf("%d", &b[i].page); // 每次输入后清空缓冲区残留的换行符 while (getchar() != '\n'); } // 测试输出,验证输入是否正确 printf("\nYou entered the following books:\n"); for (i = 0; i < c; i++) { printf("Book %d: Name: %s, Price: %.2f, Pages: %d\n", i+1, b[i].name, b[i].price, b[i].page); } return 0; }
关键修复点说明
- 替换
fflush(stdin)为while (getchar() != '\n');:这个循环会逐个读取缓冲区里的字符直到换行符,是标准且可靠的清空输入缓冲区的方法。 - 用
%19s读取书名:限制最多读19个字符,留一个位置给字符串结束符\0,避免输入过长导致缓冲区溢出,数组名直接传递给scanf即可,不用加&。 - 调整循环起始索引:从
i=0开始遍历,确保所有c个书籍元素都被处理,给用户展示的序号用i+1,符合日常计数逻辑。 - 每次输入后清空缓冲区:读取整数、浮点数后,缓冲区会残留换行符,必须清空,否则下一次输入会直接读取这个换行符,导致跳过输入步骤。
内容的提问来源于stack exchange,提问作者tomtom
相关产品推荐
相关产品推荐

