为什么我的小C程序用cat实用程序打印不同的字符串? #包括 #包括 #包括 int main() { 字符a[6]=“abcdd”; 字符b[5]=“1234”; strcpy(a,b); 写(1,a,4); printf(“AA\n”); 写(1,b,4); printf(“CC\n”); }

为什么我的小C程序用cat实用程序打印不同的字符串? #包括 #包括 #包括 int main() { 字符a[6]=“abcdd”; 字符b[5]=“1234”; strcpy(a,b); 写(1,a,4); printf(“AA\n”); 写(1,b,4); printf(“CC\n”); },c,shell,C,Shell,我在学习strcpy func 带着 1234AA 1234CC 有./a.out | e类 12341234AA$ CC$ 我读《人猫》。找不到有这个的 即使在编译之后也可以进行哪些更改 发生了什么事? 我缺少什么概念?这是一个缓冲问题 write调用直接写入标准输出文件描述符。这些写入是无缓冲的 printf函数写入stdout,在正常情况下(当stdout连接到终端时),stdout是行缓冲的(输出实际上写在换行符上) 但是当stdout未连接到终端时,例如当您通过管道传输输出时,则缓

我在学习strcpy func

带着

1234AA
1234CC
有./a.out | e类

12341234AA$
CC$
我读《人猫》。找不到有这个的

即使在编译之后也可以进行哪些更改

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

这是一个缓冲问题

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

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

但是当
stdout
未连接到终端时,例如当您通过管道传输输出时,则缓冲方案会改变。它将被完全缓冲。这意味着只有在显式刷新(或缓冲区变满)时才会写入缓冲区,这在程序退出时发生

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

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

write(STDOUT_FILENO, a, 4);
printf("AA\n");
fflush(stdout);
[请注意,我将
1
更改为POSIX预定义符号
STDOUT\u FILENO
,这通常即使快速浏览代码也更容易理解。]