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
相关产品推荐
相关产品推荐

