C语言连续两次调用fgets()时第二次不等待输入是什么原因?
问题原因
- 核心是
stdin输入缓冲区存在残留的未读字符,第二次fgets直接读取了残留内容,不会触发等待用户输入的逻辑。 fgets的规则是:接收3个参数分别为存储缓冲区、最大读取长度、输入流,它最多读取最大长度-1个字符,遇到换行符\n或EOF就停止读取,且会把读到的\n也存入缓冲区末尾,最后补\0作为字符串结束标记。- 你的测试代码中第一个
fgets第二个参数传了3,意味着最多只读取2个有效字符存入数组。如果你第一次输入时:- 输入了≥2个字符+回车:第一个
fgets只会取前2个字符,输入缓冲区会剩下后面的字符+\n - 输入了1个字符+回车:
fgets会把字符和\n都读走,这种场景下第二个fgets才会等待输入,你遇到的跳过问题属于第一种场景,和数组本身长度是3还是4没有关系。
- 输入了≥2个字符+回车:第一个
修复方案
每次调用完fgets后,手动清空stdin缓冲区的残留内容,添加如下逻辑即可:
int c; while ((c = getchar()) != '\n' && c != EOF);
修复后的完整测试代码
#include <stdio.h> int main(void) { char I[4]; fgets(I, 3, stdin); printf("%s", I); // 清空残留的输入缓冲区 int c; while ((c = getchar()) != '\n' && c != EOF); fgets(I, 3, stdin); printf("%s", I); return 0; }
内容的提问来源于stack exchange,提问作者AnProg
相关产品推荐
相关产品推荐

