printf not printing on console
我正在开始使用C语言。我正在使用eclipse(juno)作为我的IDE并安装了CDT插件。我还打开了mingw64(GCC编译器)的包装。我写了一个非常简单的程序,看它是否有效。这是我的代码:
1 2 3 4 5 6 7 8 9 10 11
| #include <stdio.h>
int main ()
{
int age ;
printf("Hello, please enter your age:
");
scanf("%d", &age );
printf("Your age is %d", age );
return 0;
} |
问题在于输出缓冲区中填充了第一个printf的字符串值,但没有将其输出到控制台。我必须输入一个数字,然后缓冲区才会将所有数据倒入控制台,因此我看到控制台是这样的:
1 2 3
| 1
Hello, please enter your age:
Your age is 1 |
而不是预期的是:
1 2 3
| Hello, please enter your age:
1
Your age is 1 |
现在,我发现我可以在第一个printf之后使用fflush(stdout),但我认为这种解决方案不是优雅的,甚至不是必需的。关于如何克服这一点的任何想法?
编辑-因为我在大学里学习,所以我不能使用本课程中没有学到的任何东西,所以只能使用printf和scanf
新编辑-我想我已经找到了对此的解释。正如我所说的,我正在输出到Eclipse内部的控制台视图。奇怪的是,如果我从Windows命令行编译并运行程序,则会得到想要的结果。因此,我认为eclipse实际上是将输出写入文件并在控制台窗口中呈现。如何在运行配置中强制eclipse打开真实的命令行窗口?
-
旁注,fflush()没什么问题,它们非常方便
-
那是非常奇怪的行为, n应该刷新stdout
-
为何重复调用printf不会刷新,除非格式字符串中有换行符?
-
这不是重复的,因为我不能使用fflush或fprintf函数。 当我从Windows中的命令行运行gcc时,我得到了正确的结果,因此我怀疑它是错误的eclipse配置的情况。 任何想法哪种配置?
输出被缓冲。
默认情况下,stdout是行缓冲的,这意味着" n"应该刷新缓冲区。
为什么在您的情况下没有发生?不知道。需要有关您的应用程序/环境的更多信息。
但是,您可以使用setvbuf()控制缓冲:
这将强制stdout进行行缓冲。
这将强制将stdout取消缓冲,因此您无需使用fflush()。
请注意,如果您有很多印刷品,它将严重影响应用程序的性能。
-
我尝试了此解决方案,发现无法在调试模式下使用printf。它卡住了,我得到:* stopped,reason =" end-stepping-range",frame = ...
-
这是我的解决方案。如果直接在终端窗口中运行程序,我可以看到程序的输出,但是如果尝试使用tee甚至将终端输出写入文件,我将一无所获。
-
你是对的。就我而言,在程序结束后,输出被缓冲并卸载,在执行结束后立即写入在执行过程中累积的所有缓冲字符串。
显然,这是Eclipse的已知错误。通过WONT-FIX的分辨率解决了此错误。我不知道为什么。链接在这里:
Eclipse C控制台错误。
-
仍然没有解决。必须禁用缓冲或以其他方式在代码中处理该缓冲。
在打印之前,请尝试进行以下设置:
-
是的-这可以工作,我在正确答案中发布的链接中建议这样做。
您可以尝试写入stderr,而不是stdout。
1 2
| fprintf(stderr ,"Hello, please enter your age
"); |
您还应该查看此相关线程。
-
我在我的大学修这门C课程,因为是101门课程,所以我不能使用材料中没有的东西(我现在只能使用printf和scanf)。出于同样的原因,我不能使用fflush。
-
您要输出到某种控制台吗?我在Linux上工作...所以我完全不熟悉Windows编译过程等。
-
我正在谈论的控制台是Eclipse IDE中的控制台。 (控制台视图)-但是正如我在另一条评论中所述,当我通过命令行使用gcc进行编译时,我得到了想要的结果,因此我强烈怀疑这是一个日食配置问题。有任何想法吗?
-
有时,如果编译器认为将其输出到某种类型的文件而不是控制台,它甚至在换行符之前都不会刷新缓冲区直到其完全填满。也许这就是正在发生的事情,因为您可以通过gcc获得想要的东西。
-
正确-是否有可能强制Eclipse在Windows命令行而不是Eclipse的控制台视图中运行c程序?
-
就像我说的那样,我完全不了解Eclipse。但是此线程可能对您的问题有用。
正如其他人指出的那样,可以在控制台或外壳程序有机会看到输出之前在程序中缓冲输出。
在包括Mac在内的类Unix系统上,默认情况下stdout具有基于行的缓冲。这意味着您的程序在看到换行符后便立即清空其stdout缓冲区。
但是,在Windows上,换行符不再特殊,并且使用了完全缓冲。 Windows根本不支持行缓冲。请参阅setvbuf上的msdn页面。
因此,在Windows上,一种好方法是完全关闭stdout缓冲,如下所示:
在您的项目文件夹中,创建一个" .gdbinit"文本文件。它将包含您的gdb调试器配置
编辑" .gdbinit",并添加以下行(不带引号):" set new-console on"
生成项目后,右键单击项目Debug>" Debug Configurations",如下所示
在"调试器"选项卡中,确保" GDB命令文件"现在指向您的" .gdbinit"文件。否则,输入" .gdbinit"配置文件的路径:
单击"应用"和"调试"。本地DOS命令行应如下所示启动
将c:\gygwin\bin作为系统环境变量或在eclipse项目中添加到PATH环境变量(属性->运行/调试->编辑)