在C语言中,为什么似乎是在printf()之前调用system()函数?
在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缓冲区或在输出行末尾添加换行符来解决这个问题。
这是由于缓冲区的原因。似乎当echo退出时,它会刷新其缓冲区。该输出将发送到STDOUT。与此同时,你自己的代码中的printf输出仍在缓冲区中,并尚未被刷新。
在printf行的末尾添加一个\n
将让你打印输出,因为printf默认是行缓冲的。
要获取更多信息,请参阅此处有关缓冲的libc部分:https://www.gnu.org/software/libc/manual/html_node/Stream-Buffering.html
在C语言中,为什么system()似乎在printf()之前被调用?
这个问题的出现原因是:
- 你使用printf将一些内容放入输出缓冲区
- 你执行一个带输出的系统命令
- 你隐式地终止程序,导致输出缓冲区刷新到输出
- 上面的最后一个步骤获取了系统输出之后的打印输出
你只问了为什么,但是如果你也想知道如何改变到你可能期望的结果,请使用以下评论中的建议:
- Fred Larson:显式刷新
- Eugene Sh.:在输出中隐式刷新,使用一个换行符
解决方法如下:
#include#include int main() { printf("Hello, "); fflush(stdout); // 显式刷新输出缓冲区 system("echo world"); // 执行系统命令输出world printf("!\n"); // 在输出中隐式刷新输出缓冲区 return 0; }