繁体   English   中英

为什么我的小型 C 程序使用 cat 实用程序打印不同的字符串?

[英]Why my small C program print different string with cat utility?

#include <string.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
  char a[6] = "abcdd";
  char b[5] = "1234";

  strcpy(a, b);

  write(1, a, 4);
  printf("AA\n");
  write(1, b, 4);
  printf("CC\n");
}

我正在研究strcpy func。

与./a.out

1234AA
1234CC

与./a.out | 猫 -e

12341234AA$
CC$

我读过人猫。 找不到这个。

编译后还能进行哪些更改?

发生了什么? 我缺少什么概念?

这是一个缓冲问题。

write调用直接写入标准 output 文件描述符。 这些写入是无缓冲的。

printf function 写入stdout ,在正常情况下(当stdout连接到终端时)是行缓冲的(输出实际上写在换行符上)。

但是当stdout没有连接到终端时,例如当你 pipe 和 output 时,缓冲方案就会改变。 它变得完全缓冲。 这意味着缓冲区只会在显式刷新(或缓冲区变满)时写入,这发生在程序退出时。

因此,将首先写入来自write的无缓冲 output。 然后当程序退出时, stdout缓冲区将被写入。

如果您在两种情况下都想要相同的行为,您可以自己显式刷新stdout缓冲区:

write(STDOUT_FILENO, a, 4);
printf("AA\n");
fflush(stdout);

[请注意,我将“幻数” 1更改为 POSIX 预定义符号STDOUT_FILENO ,即使快速浏览代码通常也更容易理解。]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM