Трубопровод к unistd.h читать segfault

Я пытаюсь передать в чтение, но после второго ввода он продолжает работать с ошибками. Что я делаю неправильно? Заранее спасибо.

 $ ./read < <(python -c 'print "BBA\nBBADD\n",')
 Please enter your first name: 
 buf=
 BBA
 BBA
 Please enter your last name: 
 buf=
 Segmentation fault (core dumped)

Я добавил код чтения в качестве ссылки, важной частью является чтение ()

//read.c
#include <stdio.h>
#include <string.h>

void prompt_name(char *name, char *msg){
    char buf[4096];

    puts(msg);

    read(0, buf, sizeof buf);
puts("buf=");
puts(buf);
    *strchr(buf, '\n') = 0;

puts(buf);
    strncpy(name, buf, 20);
puts(name);
}

void prompt_full_name(char *fullname) {
    char last[20];
    char first[20];

    prompt_name(first, "Please enter your first name: ");
    prompt_name(last, "Please enter your last name: ");

    strcpy(fullname, first);
    strcat(fullname, " ");
    strcat(fullname, last);
}


int main(int argc, char **argv){
    char fullname[42];

    prompt_full_name(fullname);
    printf("Welcome, %s\n", fullname);

    return 0;
}

`

1 ответ

read ничего не знает о строках, поэтому просто радостно читает sizeof(buf) символы без NUL-окончания buf, призвание puts(buf) затем вызывает неопределенное поведение.

Вы не должны использовать такие низкоуровневые функции для простого строкового ввода-вывода; предпочитать getline вместо. Если вы хотите использовать read, затем читайте меньшие куски, проверяйте возвращаемое значение при каждом вызове и используйте его; он говорит вам, сколько было прочитано.

Другие вопросы по тегам