我正在写一个小代码,只有五行,但它不能以正确的顺序运行。
编译完这段代码后,它会首先执行"dir"
,然后打印我的字符串。
但如果我将其更改为printf ("%s\n", "asdf");
,程序将以正确的顺序运行。
我想知道为什么会这样。 (PS,我的计算机是用gcc 4.6.2编写的,我也使用了clang,但它们有相同的结果。)
谢谢大家。
这是代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf ("%s", "asdf");
system ("dir");
return 0;
}
答案 0 :(得分:5)
我保证您的代码按顺序运行。可能printf
打印到程序未清除的缓冲区,因此dir
的输出直接到终端,而printf
的输出等待直到输出缓冲区被清除,这发生当你的程序退出时。打印换行符\n
时也会清除缓冲区,这就是为什么打印"%s\n"
似乎有效,但"%s"
似乎失败。
答案 1 :(得分:3)
\n
表示可以在某些系统(如Solaris)上打印缓冲区。这是一个功能,而不是一个错误。
答案 2 :(得分:2)
看起来的原因dir
正在printf
之前执行,因为printf
打印到stdout
和stdout
缓冲其输出 - 您的程序 以正确的顺序执行。 (正如我在this answer中提到的那样)stdout
的缓冲区通常刷新:
'\n'
)stdin
fflush()
被调用这就是为什么在正在打印的字符串中添加换行符'\n'
会导致在"asdf"
的输出之前打印dir
。
刷新缓冲区的其他替代方法包括打印到未缓冲的stderr
,或使用setbuf(stdout, NULL);
为stdout
完全禁用缓冲。但是,这两种方法似乎都不适合你的情况。
答案 3 :(得分:1)
你应该写
printf("%s\n", "asdf");
fflush (NULL); // or at least fflush(stdout)
system ("dir");
但这仍然是非常丑陋和不可移植的代码。要遍历目录,您是否考虑过readdir&amp;朋友?
答案 4 :(得分:1)
当然,订单总是正确的。我想您认为执行顺序不正确,因为控制台在printf输出之前显示由“dir”生成的文本行。但这并不意味着一个人在另一个人面前完成。我不知道打印缓冲区在您的系统中是如何工作的,但是确保每个进程都有一个文本缓冲区发送到任何输出管道。
我的猜测是,当出现CR char时,会立即刷新输出流的文本缓冲区。因此,如果你不写'\ n'字符,那么运行“dir”(你正在调用的os系统进程)的进程会在你的进程之前刷新它的输出。