printf输出乱序

Joe*_*hew 10 c printf function

我写了以下内容:

#include <stdlib.h>
#include <stdio.h>
void ExecAsRoot (char* str);
int main ()
{
  printf ("Host real ip is:");
  ExecAsRoot("ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1  -d'/'");
  return 0;
 }

void ExecAsRoot (char* str) {
  system (str);
}
Run Code Online (Sandbox Code Playgroud)

我的预期输出是:

Host real ip is:7.17.11.29
Run Code Online (Sandbox Code Playgroud)

而实际输出是:

7.17.11.29
Host real ip is:
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

dbu*_*ush 11

printf正在缓冲输出,因为正在打印的字符串不包含换行符.结果,缓冲区在程序结束之前不会被刷新,因此在输出system命令之后出现.

要刷新缓冲区,请使用fflush:

printf ("Host real ip is:");
fflush(stdout);
ExecAsRoot("ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1  -d'/'");
Run Code Online (Sandbox Code Playgroud)

如果您希望所有写入stdout都是无缓冲的,则可以使用setvbuf禁用缓冲:

setvbuf(stdout, NULL, _IONBF, 0);     // _IONBF = unbuffered
Run Code Online (Sandbox Code Playgroud)

或者更简单:

setbuf(stdout, NULL);
Run Code Online (Sandbox Code Playgroud)

然后所有写入stdout将立即出现.