【发布时间】:2014-12-11 22:45:56
【问题描述】:
在我制作的游戏中,我使用 initscr() 创建了一个 ncurses 窗口,然后用户玩游戏,当游戏结束时,程序使用 endwin() 关闭窗口,然后打印一些语句并使用用户获取输入分别是 printf 和 scanf。我的问题是,每当游戏结束时,scanf 总是在 printf 之前执行。所以它等待响应,一旦用户输入响应,它就会打印 scanf 语句之前和之后的所有内容。下面是一些示例代码:
...
endwin();
system("clear"); /* Clears terminal window */
printf("New high score!\nPlease enter your first name: ");
scanf("%s",name);
... /* file I/O stuff */
printf("Congratulations, %s!",name);
如您所见,printf 语句在 scanf 语句之前,但由于某种原因 scanf 先执行。我在没有 ncurses 窗口的情况下测试了代码,得到了想要的结果。有谁知道是什么原因造成的?
【问题讨论】:
-
您需要在您的
printf()调用之后fflush(stdout);,或者用换行符终止格式字符串。与诅咒无关。 -
@PaulGriffiths 好的,这行得通,但为什么我必须打电话给
fflush(stdout)才能让scanf()重新开始工作?从我收集的内容来看,它基本上会强制所有输出流进行更新,但是在使用printf()/scanf()时我通常不需要它(或者我会吗?) -
你不需要 - 你调用它是为了让
printf()在你的scanf()调用开始之前实际写入屏幕。 -
@PaulGriffiths 谢谢,我想我现在明白了。