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

在switch语句或循环中获取含空格输入字符串,测试代码遇问题

搞定fgets读取名字时的坑

嘿,我猜你这段代码放到main里运行时,大概率遇到了「还没来得及输入名字,程序就直接跳过输入步骤」的情况吧?毕竟这是用fgets读取带空格字符串时的高频坑,我来给你捋清楚怎么解决。

首先说问题根源:如果你的main函数里在这段代码之前用过scanf(比如读年龄、学号这类),scanf只会读取你输入的有效内容,把末尾的换行符留在了输入缓冲区里。等fgets执行时,它会直接把这个残留的换行符当成输入,导致看起来像是跳过了输入。另外,你的代码里用到了MAX但没提前定义,编译器也会直接报错,这个细节可不能漏。

两种修复方案任你选

方案1:先清空缓冲区残留的换行

在调用fgets之前,把缓冲区里剩下的字符全部读走,彻底清理残留:

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

#define MAX 15  // 必须提前定义MAX宏!

int main() {
    // 举个例子:如果之前用了scanf读取其他内容
    int age;
    printf("先输入你的年龄:");
    scanf("%d", &age);

    // 关键步骤:清空缓冲区里的残留换行符
    while (getchar() != '\n');

    char name[MAX];
    printf("What is your name? ");
    fgets(name, MAX, stdin);
    // 去掉末尾的换行符(如果存在)
    if ((strlen(name) > 0) && (name[strlen(name) - 1] == '\n'))
        name[strlen(name) - 1] = '\0';
    printf("Hello %s. Nice to meet you.\n", name);

    return 0;
}

方案2:全程用fgets读取,更安全

如果要读取多种类型的输入,全程用fgets读入缓冲区,再用sscanf转换格式,从根源避免缓冲区残留问题:

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

#define MAX 15
#define BUFFER_LEN 256

int main() {
    char temp_buf[BUFFER_LEN];
    int age;

    printf("先输入你的年龄:");
    fgets(temp_buf, BUFFER_LEN, stdin);
    sscanf(temp_buf, "%d", &age);  // 将读取到的字符串转换为整数

    char name[MAX];
    printf("What is your name? ");
    fgets(name, MAX, stdin);
    if ((strlen(name) > 0) && (name[strlen(name) - 1] == '\n'))
        name[strlen(name) - 1] = '\0';
    printf("Hello %s. Nice to meet you.\n", name);

    return 0;
}

小提醒

如果你的main函数里完全没用到其他输入函数还是出问题,那可以检查下是不是终端输入流的异常,重启终端试试基本就能解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:14:11