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

C语言for循环仅首次scanf生效,后续scanf被跳过问题咨询

解决你的for循环中scanf跳过问题

嘿,我来帮你搞定这个输入跳过的问题——这是C语言输入处理里的典型坑,咱们一步步拆解修复:

问题根源拆解

你的代码里有三个核心问题导致了输入被跳过的现象:

  1. fflush(stdin)是未定义行为
    C标准明确规定fflush只能用于输出流,对stdin调用它的结果是不确定的,不同编译器表现不一样,这根本不是可靠的清空输入缓冲区的方法。

  2. 字符串输入的格式符用错了
    你用scanf(" %c", &b[i].name);读书名,但name是char[20]数组,%c只能读单个字符,而且b[i].name本身就是数组的首地址,不需要加&,这里应该用%s来读取字符串。

  3. 循环起始索引出错
    你的循环是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:06:26