我已经在我的Windows机器上设置了Eclipse进行c编程,我已经成功运行了一个“hello,world”程序。但是,当我尝试请求用户输入并运行程序时,Eclipse上的控制台显示的顺序错误。
这就是我所拥有的
#include <stdio.h>
int main(void){
char letter;
printf("Please enter a letter:\n");
scanf(" %c, &letter);
printf("The letter you have selected is: %c", letter);
return 0;
}
这个程序构建得很好,它在Eclipse之外运行得很好。但是当我在Eclipse中运行它时,我得到输出:
E <--- (this is my user input)
Please enter a letter:
The letter you have selected is: E
我不确定为什么输出执行顺序错误,所以任何帮助都会非常感激!谢谢。
答案 0 :(得分:4)
听起来Eclipse正在缓冲程序的输出而不是立即显示它。这表明“在Eclipse中运行”功能并不打算运行交互式程序。
您可以尝试在第一个fflush(stdout);
之后添加printf
,但您不应该这样做只是为了让您的程序在特定环境中运行。
答案 1 :(得分:4)
是的,Eclipse会在输出窗口出现之前缓冲一定数量的输出(我不记得有多少输出)。 Eclipse通过完全缓冲的管道与连接的进程进行通信。在调用fflush()
或缓冲区已满之前,它不会刷新。我发现在使用Eclipse进行调试时,如果我将以下内容放在应用程序的开头附近,那么事情最有效:
setvbuf(stdout, NULL, _IONBF, 0);
这将导致stdout
在写入时立即刷新。如果你想用它进行调试并关闭它,你可以有条件地编译它:
#ifdef DEBUG
setvbuf(stdout, NULL, _IONBF, 0);
#endif
无需以这种方式放置fflush()
。
当我第一次遇到这个问题时,我就找到了这个解决方案。
http://wiki.eclipse.org/CDT/User/FAQ#Eclipse_console_does_not_show_output_on_Windows
Eclipse的控制台不是真正的控制台或终端,而是eclipse通过管道进行通信,管道完全缓冲而不是行缓冲。这就是换行符'\ n'不会导致刷新缓冲区的原因。
答案 2 :(得分:2)
尝试在第一个fflush(stdout);
之后添加printf
。如果Eclipse在'\n'
之后没有自动刷新,那么这有很大的帮助机会。
答案 3 :(得分:0)
是的,fflush()
缓冲区是保持控制台屏幕更新所必需的......
...但请伙伴们,不是Eclipse的错误输入和输出可能会不同步,但是库正在使用中!