为什么我的小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”); }
我在学习strcpy func 带着为什么我的小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未连接到终端时,例如当您通过管道传输输出时,则缓
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
,这通常即使快速浏览代码也更容易理解。]