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

C语言中scanf读取人数后fgets跳过2d字符数组首项输入的问题

问题原因说明

这个问题和二维数组的实现完全无关,是scanf与fgets搭配使用时的输入缓冲区特性导致的。

根因分析

调用scanf("%d", &numOfPatients)读取人数时,仅会提取输入流中的数字字符,用户输入数字后按下回车产生的**换行符\n**会残留在标准输入缓冲区中。
而fgets的读取逻辑是:只要碰到换行符就会立即结束本次读取,将换行符之前的内容(包括换行符本身)存入目标数组。因此第一次循环调用fgets时,会直接读到缓冲区残留的换行符,相当于读取到了一个仅包含换行符的空字符串,表现为跳过第一个姓名输入。

修复方案

只需要在scanf读取人数后、进入循环读取姓名前,清空输入缓冲区中残留的换行符即可,推荐实现方式:

int numOfPatients;
printf("Enter the number of people\n");
scanf("%d", &numOfPatients);
// 新增:清空输入缓冲区残留的换行符
while(getchar() != '\n');
char name[numOfPatients][30];
for (int i = 0; i < numOfPatients; i++)
{
    printf("Enter person %d name\n", i + 1);
    fgets(name[i], 30, stdin);
    printf("%s", name[i]);
}
  • 注意:该清理方式仅适用于scanf读取后缓冲区仅残留换行符的场景,如果需要兼容更复杂的残留内容,可以扩展判断逻辑,避免读到EOF时陷入死循环。
  • 优化建议:如果要彻底规避这类输入匹配问题,也可以统一使用fgets读取所有输入内容,再用sscanf从读取到的字符串中解析数字,逻辑更可控。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:15:02