#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 | 猫
12341234AA$
CC$
我读人猫。找不到与此。
即使编译后仍可以进行哪些更改?
发生了什么?我缺少什么概念?
这是一个缓冲问题。
该write
调用直接写入到标准输出文件描述符。这些写操作是无缓冲的。
该printf
函数写stdout
在正常情况下(stdout
连接到端子时)是行缓冲的(输出实际上写在换行符上)。
但是,当stdout
未连接到端子时(例如,通过管道传输输出时),缓冲方案将更改。它变得完全缓冲。这意味着仅在显式刷新(或缓冲区变满)时才写入缓冲区,这在程序退出时发生。
因此,来自的未缓冲输出write
将首先被写入。然后,当程序退出时,stdout
将写入缓冲区。
如果在两种情况下都想要相同的行为,则可以stdout
自己显式刷新缓冲区:
write(STDOUT_FILENO, a, 4);
printf("AA\n");
fflush(stdout);
[请注意,我将“幻数” 1
更改为POSIX预定义符号STDOUT_FILENO
,即使快速浏览一下代码,通常也更容易理解。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句