以下代码演示如果输入中有\0
,则输入后不会读取。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
int fd;
int fd2;
char buf[200];
int n;
char fname[] = "/tmp/tst-perror.XXXXXX";
fd = mkstemp (fname);
fd2 = dup (fd);
write(fd2, "a", 2); // \0 is written out
write(fd2, "b", 1);
write(fd2, "\n", 1);
close (fd2);
lseek (fd, 0, SEEK_SET);
n = read (fd, buf, sizeof (buf));
printf("%.*s", (int) n, buf);
close (fd);
unlink (fname);
return 0;
}
输出为a
。
如果我们在第一个1
中使用2
而不是write()
,则输出为ab
。这是正确的行为吗?我在read(2)中没有找到任何关于它的内容。
答案 0 :(得分:1)
input
字节后,\0
读取。但是,%s
printf
格式说明符需要\0
- 终止字符串。
而不是printf
尝试write
将n
字节转换为STDOUT_FILENO
或1:
write(1, buf, n);