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

C语言使用scanf、fgets读取输入时跳过输入步骤的问题求助

问题根因
  • C语言的标准输入函数会共用输入缓冲区,使用scanf读取%d、%lf、%s这类格式内容时,仅会读取匹配的目标内容,输入完成后按下的换行符\n会残留在缓冲区中。
  • %c格式符、fgets函数不会自动跳过缓冲区开头的空白字符(含换行、空格、制表符),会直接读取残留的\n作为输入内容,因此表现为直接跳过输入环节。
修复方案

只需要针对两处输入位置做调整即可:

  1. 读取grade的scanf格式串中,在%c前添加一个空格,该空格会指示scanf自动跳过所有前置空白字符,避免读取残留换行:
    将scanf("%c", &grade);修改为scanf(" %c", &grade);
  2. 读取完name后,先调用一次getchar()吃掉scanf("%s")残留的换行符,再调用fgets读取全名:
    在scanf("%s", name);后新增一行getchar();
修改后完整代码
#include <stdlib.h>
#include <stdio.h>

int main()
{
    int age; 
    printf("Enter your age: ");
    scanf("%d", &age); 
    printf("You are %d years old\n", age);

    double gpa;
    printf("Enter your GPA: ");
    scanf("%lf", &gpa);
    printf("Your GPA is %f\n", gpa);

    char grade;
    printf("Enter your Grade: ");
    scanf(" %c", &grade); // %c前加空格跳过前置空白字符
    printf("Your Grade is %c\n", grade);

    char name[20];
    printf("Enter your Name: ");
    scanf("%s", name);
    getchar(); // 吃掉scanf("%s")残留的换行符
    printf("Your name is %s\n", name);

    char fullname[20];
    printf("Enter your full name: ");
    fgets(fullname, 20, stdin);
    printf("Your full name is %s\n", fullname);

    return 0;    
}
补充说明

如果存在输入内容超过变量长度的场景,残留的内容可能不止一个换行符,可以用循环清空缓冲区的方式处理,替代单条getchar():

int c;
while((c = getchar()) != '\n' && c != EOF);

该代码会一直读取缓冲区内容直到遇到换行或输入结束,彻底清空残留内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:48:04