C语言中fgets未调用时程序提前等待输入的原因
问题根源
问题出在scanf("%d\n", &number);格式字符串末尾的\n上。scanf()对格式串中空白字符(空格、\n、\t都属于空白字符)的匹配逻辑是:匹配输入流中连续任意数量的空白字符,直到遇到第一个非空白字符才会终止匹配,不会只匹配单个换行。
实际执行流程和你遇到的现象完全对应:
- 你输入
10敲回车后,%d顺利读走整数10,接下来格式串里的\n开始工作:它先吃掉你敲的回车换行,发现后面没有非空白字符,就会一直阻塞等待更多输入,直到你输入下一个非空白内容(也就是你原本要给fgets输入的字符串开头的a),scanf才会执行结束。 - 等scanf返回时,输入缓冲区里已经留着你刚输入的
a string内容,后续fgets执行时不会再等待新输入,直接把缓冲区里现存的内容读走,就出现了“还没调用fgets就开始等输入、fgets执行时不卡顿直接读走内容”的异常表现。
修复方法
- 首先删掉scanf格式串末尾多余的
\n,把读取整数的语句改成scanf("%d", &number); - 注意:
scanf("%d")只读走整数数字部分,你输入完整数敲的回车会残留在输入缓冲区,如果直接调用fgets,会直接读到这个空换行、拿到空字符串,所以需要在scanf之后加一段逻辑,清空整数后残留的缓冲区内容。
修正后的完整代码:
#include <stdio.h> int main() { int number; char string[32]; int c; printf("Input the number.\n> "); scanf("%d", &number); // 清空输入缓冲区中整数后面残留的所有字符直到换行 while ((c = getchar()) != '\n' && c != EOF); printf("\nInput the string.\n> "); fgets(string, 32, stdin); printf("\nnumber: %d\nstring: %s\n", number, string); return 0; }
补充提示:如果后续要混用scanf和逐行读取函数(比如fgets),一定要注意scanf不会自动消耗输入末尾的换行,残留的换行很容易导致后续读取逻辑出错,最稳妥的方式是每次scanf读取完格式化内容后,主动清空行尾残留的输入内容。
内容的提问来源于stack exchange,提问作者Curtice Gough
相关产品推荐
相关产品推荐

