C程序以错误的顺序输出Eclipse

nla*_*and 5 c eclipse

我已经在我的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;
    }
Run Code Online (Sandbox Code Playgroud)

这个程序构建得很好,它在Eclipse之外运行得很好.但是当我在Eclipse中运行它时,我获得了输出:

E <--- (this is my user input)

Please enter a letter:

The letter you have selected is: E
Run Code Online (Sandbox Code Playgroud)

我不确定为什么输出执行顺序错误,所以任何帮助都会非常感激!谢谢.

Dav*_*ger 5

是的,Eclipse 会缓冲一定量的输出(我不记得有多少剩余),然后才会出现在输出窗口中。Eclipse 正在通过一个完全缓冲的管道与附加的进程进行通信。fflush()在调用或缓冲区已满之前,它不会刷新。我发现在使用 Eclipse 进行调试时,如果我将以下内容放在应用程序的开头附近,则效果最佳:

setvbuf(stdout, NULL, _IONBF, 0);
Run Code Online (Sandbox Code Playgroud)

这将导致stdout在写入时立即刷新。如果你想用它来调试并关闭它,你可以有条件地编译它:

#ifdef DEBUG
setvbuf(stdout, NULL, _IONBF, 0);
#endif
Run Code Online (Sandbox Code Playgroud)

无需以fflush()这种方式到处放置。

编辑

这是我自己第一次遇到这个问题时找到解决方案的地方。

http://wiki.eclipse.org/CDT/User/FAQ#Eclipse_console_does_not_show_output_on_Windows

Eclipse 的控制台不是真正的控制台或终端,而是 Eclipse 通过完全缓冲而不是行缓冲的管道与附加进程进行通信。这就是换行符 '\n' 不会导致缓冲区被刷新的原因。