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

C语言使用scanf后调用fgets读取浮点数组被跳过问题求解

问题原因

前面使用的scanf("%f")、scanf("%d")这类格式化输入函数,仅会读取匹配格式要求的数值内容,不会处理用户输入完成后按下回车键产生的换行符\n,这个换行符会一直残留在标准输入缓冲区中。
后续调用fgets()时,该函数的读取逻辑是遇到换行符就结束本次读取,因此会直接读取到残留的换行符,看起来就像直接跳过了输入环节。

修复方案

只需要在最后一次scanf调用之后、调用fgets之前,清空标准输入缓冲区中残留的换行符即可,常见实现方式如下:

方案1:循环读取残留字符直到换行(最稳妥)

在printf("enter array: ");之前加入如下代码:

// 清空输入缓冲区残留的换行及其他多余字符
int c;
while ((c = getchar()) != '\n' && c != EOF);

这种方式可以处理用户输入数值时多敲的多余空格、字符等内容,兼容性最好。

方案2:在scanf格式串中处理换行

也可以直接修改最后一个scanf的格式串,主动吃掉后续的换行符,将原来的scanf("%d",&t);修改为:

scanf("%d%*c",&t);

其中%*c的作用是读取一个字符(也就是输入完t后的换行符)并且不赋值给任何变量,适合确认用户输入只会多一个换行的场景。

修复后完整代码示例

#include <stdio.h>

int main()
{
    float a, b;
    int t;

    printf("A: ");
    scanf("%f",&a);
    printf("B: ");
    scanf("%f",&b);
    printf("T: ");
    scanf("%d",&t);

    // 清空输入缓冲区
    int c;
    while ((c = getchar()) != '\n' && c != EOF);

    printf("enter array: ");
    char str[100];
    fgets(str, 100, stdin);
    printf("%s", str);

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:57:03