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

关于scanf与fgets配合使用时无法输入的C语言问题咨询

问题分析与解决:scanf后fgets跳过输入的问题

问题根源

当你用scanf("%lf", &nUm)输入数字并按下回车键时,**换行符(\n)**会残留在标准输入缓冲区中。后续调用fgets()时,它会直接读取到这个换行符,误认为已经完成输入,因此跳过了名字的输入环节。

解决方法

方法1:用getchar()清空缓冲区残留的换行符

在scanf之后调用getchar(),直接消耗掉缓冲区里的换行符:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    double nUm;
    char name[100];

    printf("enter number \t:");
    scanf("%lf", &nUm);
    getchar(); // 吃掉输入数字后遗留的换行符
    printf("%f\n", nUm);

    printf("enter name \t:");
    fgets(name, 100, stdin);
    printf("%s", name);

    return 0;
}

方法2:通过scanf格式串处理换行符

修改scanf的格式控制符,用%*c读取并丢弃换行符(*表示读取但不存储):

#include <stdio.h>
#include <stdlib.h>

int main()
{
    double nUm;
    char name[100];

    printf("enter number \t:");
    scanf("%lf%*c", &nUm); // %*c 自动吃掉换行符
    printf("%f\n", nUm);

    printf("enter name \t:");
    fgets(name, 100, stdin);
    printf("%s", name);

    return 0;
}

如果输入数字后还输入了空格再回车,建议用循环清空缓冲区所有残留字符:

// 在scanf后添加这段代码
int c;
while((c = getchar()) != '\n' && c != EOF);

方法3:统一用fgets读取输入,再转换为数字

避免混合使用scanf和fgets,先读取数字的字符串形式,再用atof()转换为double类型:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    double nUm;
    char num_str[100];
    char name[100];

    printf("enter number \t:");
    fgets(num_str, 100, stdin);
    // 去掉字符串末尾的换行符
    num_str[strcspn(num_str, "\n")] = '\0';
    nUm = atof(num_str);
    printf("%f\n", nUm);

    printf("enter name \t:");
    fgets(name, 100, stdin);
    printf("%s", name);

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 09:20:42