2016-10-12 5 views
-1

Следующий код демонстрирует, что при вводе \0 вход не считывается после него.Почему ' 0' заканчивает ввод read()?

#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. Это правильное поведение? Я не нашел ничего об этом в чтении (2).

+2

Это как с-строки работы. В противном случае ваш 'printf' не будет знать, где заканчивается строка. – tkausl

+0

Лучшим критерием является заполнение буфера некоторым символом, например. '' x'', затем 'read' и распечатать содержимое буфера в виде шестнадцатеричных чисел в цикле:' for (int i = 0; i <20; i ++) printf ("% 02x \ n", buf [ я]); ' – user3386109

ответ

1

input читается после\0 байт. Однако, %sprintf спецификатор формата рассчитывает \0 -строенная строка.

Вместо printf попробовать write ИНГ n байт STDOUT_FILENO или 1:

write(1, buf, n); 
Смежные вопросы