Трубопровод к 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
, затем читайте меньшие куски, проверяйте возвращаемое значение при каждом вызове и используйте его; он говорит вам, сколько было прочитано.