scanf没有读取输入
我阅读了更多关于scanf的post,我找到了一些没有帮助我的答案:
while(!comanda){ int tmp; if (scanf("%d", &tmp) == 0) getchar(); else{ comanda = tmp; fprintf(stdout,"%d",&comanda); fflush(stdout);} } }
问题是在这行代码执行后,没有任何反应。 在此之后,我检查了“comanda”,但没有执行。
scanf
和所有格式化输入function的问题之一是终端倾向于以线路模式或熟化模式操作,并且API被设计用于原始模式。 换句话说,在遇到换行之前, scanf
实现通常不会返回。 输入被缓冲,将来对scanf
调用将消耗缓冲线。 考虑以下简单程序:
#include int main() { int a_number; printf("Enter a number: "); fflush(stdout); while (scanf("%d", &a_number) != EOF) { printf("you entered %d\n", a_number); printf("Enter another number: "); fflush(stdout); } return 0; }
您可以在按返回前输入多个数字。 以下是运行此程序的示例。
bash$ gcc foo.c bash$ ./a.out Enter a number: 1 2 3 4 5 6 7 8 9 10 you entered 1 Enter another number: you entered 2 Enter another number: you entered 3 Enter another number: you entered 4 Enter another number: you entered 5 Enter another number: you entered 6 Enter another number: you entered 7 Enter another number: you entered 8 Enter another number: you entered 9 Enter another number: you entered 10 Enter another number: bash$ bash$
每次调用scanf
从输入流中读取一个数字,但第一次调用直到我按下返回后才返回 。 其余的调用立即返回而不会阻塞更多输入,因为输入流是缓冲的,它可以从流中读取另一个整数。
替代方案是使用fgets
并一次处理整行数据或使用终端接口禁用“规范输入处理” 。 大多数人使用fgets
因为POSIX的终端接口部分没有在Windows下实现。
您的scanf("%d", &tmp)
可以返回3个值中的一个
- 如果它返回
1
则表示读取了一个值并将其放入tmp中 - 如果它返回
0
则表示缓冲区中存在错误的字符(您使用下一个getchar()
检测并删除它) - 如果它返回
EOF
则表示stdin
处于文件结束条件。 无论你做了多少getchar()
,“文件结束”条件都不会消失,你就陷入无限循环。
还要测试scanf的返回值是否为EOF。
while(!comanda){ int tmp; int ret; ret = scanf("%d", &tmp); if (ret == 0) getchar(); else if (ret == EOF){ perror("stdin end-of-file"); break; /* get out of the loop */ } else { comanda = tmp; fprintf(stdout,"%d",comanda); /* & is an error */ fflush(stdout);} } }
或者,甚至更好 ,重做您的程序以使用fgets()
读取整行并使用sscanf()
解析它。