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

C语言学生信息录入跳过第二位学生姓名问题的修复方案

问题根因
  • 该问题是C语言标准输入缓冲区残留换行符导致的典型问题:
    录入第一位学生的最后一项信息(多为分数、出生日期这类数值类型)时,通常会使用scanf("%d")、scanf("%f")这类匹配数值的格式符完成输入,用户按下的回车键产生的\n(换行符)不属于数值类格式符的匹配范围,不会被读取,会直接残留在输入缓冲区中。
  • 当程序执行到第二位学生的姓名录入逻辑时,如果使用fgets()、gets()或者带%c/%s的scanf()读取输入,残留的换行符会被当成用户输入的内容直接读取,程序就会判定姓名已经录入完成,直接跳转到下一个学号输入步骤。
修复方案

方案1:数值输入后主动清空缓冲区

在每一次数值类输入完成后、下一次字符串/字符输入前,执行代码清空缓冲区的残留内容,推荐写法:

// 逐个读取缓冲区字符直到遇到换行符或结束符,清空所有残留
int tmp;
while ((tmp = getchar()) != '\n' && tmp != EOF);

该方案兼容性强,适合所有场景,不会影响后续输入逻辑。

方案2:统一按行读取输入再解析

避免混合使用数值类scanf和字符串读取函数,所有输入统一用fgets()按行读取,需要数值的话再用sscanf()从读到的字符串中解析,从根源上避免缓冲区残留问题,示例:

char read_buf[256];
// 读取姓名
printf("请输入学生姓名:");
fgets(read_buf, sizeof(read_buf), stdin);
sscanf(read_buf, "%[^\n]", stu.name); // 过滤末尾换行符后存入姓名字段
// 读取学号(数值类型)
printf("请输入学生学号:");
fgets(read_buf, sizeof(read_buf), stdin);
sscanf(read_buf, "%d", &stu.stu_id);

该方案还支持录入包含空格的姓名、地址等字符串,适用范围更广。

方案3:scanf读取字符串前加空格跳过空白符

如果习惯使用scanf读取字符串,可以在格式符前添加一个空格,通知scanf自动跳过输入前所有的空白字符(包含换行符、空格、制表符):

// 注意%s前有一个空格
scanf(" %s", stu.name);

注意:该方案不支持读取包含空格的字符串,%s碰到空格就会停止匹配,仅适合姓名等字段无空格的简单场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 01:36:03