为什么'\ 0'结束read()的输入?

时间:2016-10-12 06:59:48

标签: c

以下代码演示如果输入中有\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)中没有找到任何关于它的内容。

1 个答案:

答案 0 :(得分:1)

input字节后,\0读取。但是,%s printf格式说明符需要\0 - 终止字符串。

而不是printf尝试writen字节转换为STDOUT_FILENO或1:

write(1, buf, n);