在C语言中,为什么似乎是在printf()之前调用system()函数?

11 浏览
0 Comments

在C语言中,为什么似乎是在printf()之前调用system()函数?

请查看代码。

#include "stdio.h"
#include "stdlib.h"
int main() {
    printf("Hello World");
    system("echo \"Hello c\"");
}

操作结果:

Hello c
Hello World

为什么似乎是在printf()之前调用了system()?

上述测试结果是在Manjaro系统上运行的,但在Windows系统上不存在这种现象。

0
0 Comments

在C语言中,为什么system()函数似乎在printf()函数之前调用?出现这种情况的原因是,您在stdout缓冲区中有一个输出行,因为您没有在行尾加上'\n'。如果在输出行的末尾加上'\n',则会在调用system之前打印出该行。

这是因为stdio在输出设备为终端时使用行缓冲。它会将所有字符缓冲直到缓冲区满(由于缓冲区的大小可能为16-32KB,具体取决于系统),或者输出一个新行。然后缓冲区被刷新。但是您没有使用'\n',所以缓冲区会一直等到调用system(3)后程序结束。

有几种方法可以解决这个问题:

- 您可以通过调用fflush(stdout)来强制刷新缓冲区。这将使stdio将缓冲区的内容写入,您将在您的system()命令的输出之前看到您的行(没有换行符)。

- 您可以告诉stdio不要在stdout上使用缓冲区。可以使用setbuf(stdout, NULL)来实现。这样,您进行的每个printf()调用都将在字符串格式化时写入,因为没有缓冲区来暂时保存它们。

- 您可以在输出行末尾加上'\n'。通过在调用system()之前插入一个换行符,您将看到输出的差异。

如果您的输出不是到终端设备而是到文件,则情况更糟,因为只有当缓冲区完全填满时(而不是在行末尾)才会进行缓冲区刷新,您将在程序的所有输出之前看到system()调用的完整输出(假设在调用printf()之前打印了多行,并且被调用的程序及其输出都重定向到文件中)。

总结起来,如果您希望在调用system()之前打印出printf()的输出,您可以通过刷新缓冲区、禁用stdout缓冲区或在输出行末尾添加换行符来解决这个问题。

0
0 Comments

这是由于缓冲区的原因。似乎当echo退出时,它会刷新其缓冲区。该输出将发送到STDOUT。与此同时,你自己的代码中的printf输出仍在缓冲区中,并尚未被刷新。

在printf行的末尾添加一个\n将让你打印输出,因为printf默认是行缓冲的。

要获取更多信息,请参阅此处有关缓冲的libc部分:https://www.gnu.org/software/libc/manual/html_node/Stream-Buffering.html

0
0 Comments

在C语言中,为什么system()似乎在printf()之前被调用?

这个问题的出现原因是:

  • 你使用printf将一些内容放入输出缓冲区
  • 你执行一个带输出的系统命令
  • 你隐式地终止程序,导致输出缓冲区刷新到输出
  • 上面的最后一个步骤获取了系统输出之后的打印输出

你只问了为什么,但是如果你也想知道如何改变到你可能期望的结果,请使用以下评论中的建议:

  • Fred Larson:显式刷新
  • Eugene Sh.:在输出中隐式刷新,使用一个换行符

解决方法如下:

#include 
#include 
int main() {
    printf("Hello, ");
    fflush(stdout); // 显式刷新输出缓冲区
    system("echo world"); // 执行系统命令输出world
    printf("!\n"); // 在输出中隐式刷新输出缓冲区
    return 0;
}

0