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

输入残留换行符致程序跳过驾驶员姓名输入问题排查

输入异常问题:跳过姓名输入直接进入驾照号码环节

程序循环调用func1时,驾驶员2、3的姓名输入步骤会被直接跳过,直接进入驾照号码输入环节。你推测的原因完全正确——之前scanf输入整数后,输入缓冲区中残留的换行符(按下Enter产生)被后续的gets读取,导致姓名输入被直接跳过。

问题代码

void func1(char name[], int *lic, int *km)
{
    printf("Enter your name:-
");
    gets(name);

    printf("Enter your license no.:-
");
    scanf("%d", lic);

    printf("Enter number of kilometers driven:-
");
    scanf("%d", km);
}

问题根源

scanf("%d", lic)和scanf("%d", km)只会读取输入的整数部分,按下Enter产生的换行符会留在输入缓冲区中。当下一次调用func1时,gets(name)会直接读取这个残留的换行符,认为已经完成了姓名输入,直接跳过姓名提示环节。另外,gets函数已被C标准废弃,它不检查输入长度,极易导致缓冲区溢出,安全性极差。

解决方案

这里提供两种可靠的修改方案:

方案1:用fgets替代gets并清理缓冲区

#include <string.h> // 需要包含strcspn的头文件

void func1(char name[], int *lic, int *km)
{
    printf("Enter your name:-
");
    fgets(name, sizeof(name), stdin); // 安全读取字符串,限制长度
    name[strcspn(name, "
")] = '\0'; // 去掉fgets读取的换行符

    printf("Enter your license no.:-
");
    scanf("%d", lic);
    getchar(); // 吃掉缓冲区残留的换行符

    printf("Enter number of kilometers driven:-
");
    scanf("%d", km);
    getchar(); // 吃掉缓冲区残留的换行符
}

方案2:统一用scanf读取所有输入

void func1(char name[], int *lic, int *km)
{
    printf("Enter your name:-
");
    scanf("%20[^
]", name); // 限制读取20个字符(需保证name数组长度≥21)
    getchar(); // 吃掉换行符

    printf("Enter your license no.:-
");
    scanf("%d", lic);
    getchar(); // 吃掉换行符

    printf("Enter number of kilometers driven:-
");
    scanf("%d", km);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 05:05:45