printf输出乱序

时间:2017-08-02 18:07:43

标签: c function printf

我写了以下内容:

#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);
}

我的预期输出是:

Host real ip is:7.17.11.29

虽然实际输出是:

7.17.11.29
Host real ip is:

为什么会这样?

1 个答案:

答案 0 :(得分: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'/'");

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

setvbuf(stdout, NULL, _IONBF, 0);     // _IONBF = unbuffered

或更简单:

setbuf(stdout, NULL);

然后,所有对stdout的写入都会立即显示。