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

C语言混用gets()与scanf()导致输入跳过问题如何排查解决?

问题核心原因

  • scanf("%d")读取整数时仅消费输入缓冲区中的数字字符,用户输入完成后按下的换行符\n会残留在缓冲区中
  • 后续调用的gets()函数遇到换行符会直接判定为输入结束,读取到空字符串,表现为输入项被跳过
  • 额外提醒:gets()函数已被C标准完全废弃,该函数不做输入长度校验,极易触发缓冲区溢出漏洞,存在严重安全风险,必须替换为fgets()

修复方案

  1. 每次调用scanf()后手动清空输入缓冲区的残留内容,避免下一次读取字符串时读到空内容
  2. 用fgets()替代gets(),如果不需要字符串末尾保留换行符可手动清除

修复后完整代码

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

struct driver
{
    char drivername[500];
    int license;
    char route[500];
    int kilometers;
};

// 清空输入缓冲区工具函数
void clear_input_buffer() {
    int c;
    while ((c = getchar()) != '\n' && c != EOF);
}

int main()
{
    struct driver Driver1; 

    printf("Driver 1 enter your details\n");
    printf("Enter your name \n");
    // 替换gets为fgets,参数分别为缓冲区地址、缓冲区长度、输入流
    fgets(Driver1.drivername, sizeof(Driver1.drivername), stdin);
    // 去掉fgets读取到的末尾换行符
    Driver1.drivername[strcspn(Driver1.drivername, "\n")] = '\0';
    
    printf("Enter your license number \n");
    scanf("%d", &Driver1.license);
    // 清空scanf残留的换行
    clear_input_buffer();

    printf("Enter the route on which you travel on \n");
    fgets(Driver1.route, sizeof(Driver1.route), stdin);
    Driver1.route[strcspn(Driver1.route, "\n")] = '\0';

    printf("Enter the number of kilometers travelled with the company \n");
    scanf("%d" , &Driver1.kilometers);
    clear_input_buffer();

    printf("司机姓名:%s\n", Driver1.drivername);
    printf("行驶路线:%s\n", Driver1.route);
    printf("驾照号码:%d\n", Driver1.license);
    printf("行驶公里数:%d\n", Driver1.kilometers);

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:54:07