我的c代码不能按顺序运行

时间:2011-12-10 08:16:00

标签: c

我正在写一个小代码,只有五行,但它不能以正确的顺序运行。 编译完这段代码后,它会首先执行"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;
} 

5 个答案:

答案 0 :(得分:5)

我保证您的代码按顺序运行。可能printf打印到程序未清除的缓冲区,因此dir的输出直接到终端,而printf的输出等待直到输出缓冲区被清除,这发生当你的程序退出时。打印换行符\n时也会清除缓冲区,这就是为什么打印"%s\n"似乎有效,但"%s"似乎失败。

答案 1 :(得分:3)

\n表示可以在某些系统(如Solaris)上打印缓冲区。这是一个功能,而不是一个错误。

答案 2 :(得分:2)

看起来的原因dir正在printf之前执行,因为printf打印到stdoutstdout缓冲其输出 - 您的程序 以正确的顺序执行。 (正如我在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系统进程)的进程会在你的进程之前刷新它的输出。