C语言程序中fgets无法读取输入的问题及顺序输出需求
问题分析与解决
核心问题是**scanf读取整数后残留的换行符被fgets直接读取**,导致它看起来“无响应”:
- 用
scanf("%d", &numWords)输入整数后,你按下的回车(\n)会留在标准输入缓冲区里。 - 后续调用
fgets时,它会优先读取这个换行符,直接得到空行,不会等待新输入。
你提到添加换行符后提示无法打印,这是因为标准输出默认是行缓冲模式——只有输出包含换行符,或者手动刷新缓冲区时,内容才会显示到终端。如果printf的字符串没有换行且没手动刷新,就会出现提示延迟显示的情况。
解决方案
方法1:清除scanf残留的换行符
在scanf之后用getchar()吃掉缓冲区里的换行符,同时手动刷新输出缓冲区确保提示立即显示:
#include <stdio.h> int main(void) { int numWords; char str[100]; printf("Enter how many words:\n"); scanf("%d", &numWords); getchar(); // 吃掉输入整数后留下的换行符 printf("Enter %d words:", numWords); fflush(stdout); // 手动刷新输出缓冲区,确保提示立刻显示 fgets(str, 100, stdin); return 0; }
注:如果用户输入整数后还输入了其他非换行字符(比如5 abc),getchar()只会吃掉第一个字符,这种场景可以用循环清空缓冲区直到遇到换行。
方法2:用scanf格式符直接跳过换行
在scanf的格式字符串里添加%*c,表示读取一个字符但不存储,直接跳过换行:
scanf("%d%*c", &numWords);
这种方式比getchar()更简洁,但仅适用于单个残留字符的场景。
方法3:全程用fgets读取输入(更健壮)
避免混合使用scanf和fgets,先用fgets读取整行输入,再用sscanf解析整数,从根源上避免缓冲区残留问题:
#include <stdio.h> int main(void) { int numWords; char inputBuf[100]; char str[100]; printf("Enter how many words:\n"); fgets(inputBuf, 100, stdin); sscanf(inputBuf, "%d", &numWords); // 从读取的行中解析整数 printf("Enter %d words:", numWords); fflush(stdout); fgets(str, 100, stdin); return 0; }
这种方式更适合复杂程序,能避免各种输入缓冲区的异常情况。
内容的提问来源于stack exchange,提问作者gcasey
相关产品推荐
相关产品推荐

