C getline продолжает принимать ввод после новой строки - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь по существу взять строку текста у пользователя и перевернуть ее.

#define LENGTH 0xFF

char *buffer = malloc(LENGTH), *output = malloc(LENGTH);
unsigned char length_read, count = 0;
length_read = getline(&buffer, 0, stdin);

while (length_read >= 0)
  output[count++] = buffer[length_read--];

Теоретически значение output должно быть обратным buffer.Но когда я запускаю свою программу, getline, похоже, не останавливает чтение ввода с клавиатуры, и программа не продвигается.Я использую GCC с -std=c11.Из любопытства я поставил два разных вызова на printf по обе стороны линии, вызывая getline, и оба распечатали свои выводы.Я не совсем уверен, что я делаю что-то неправильно или неправильно понимаю.

1 Ответ

0 голосов
/ 17 декабря 2018

В вашем коде у вас есть:

char *buffer = malloc(LENGTH);
unsigned char length_read;
length_read = getline(&buffer, 0, stdin);

Что заставляет вас думать, что вы можете передать нулевой указатель на длину?Спецификация POSIX для getline() определенно не позволяет этого - она ​​требует, чтобы функция могла записать в *n.Я не вижу облегчения в справочных страницах Linux для getline(3).Я думаю, что вы используете неопределенное поведение;Я удивлен, что вы не просто зависаете.

Кроме того, если вы печатаете оба ваших заявления printf(), то getline() само по себе не застревает.

Использование unsigned char длявозвращаемое значение из getline() нарезается смертью - оно возвращает ssize_t, которое обычно составляет не менее 4 байтов и часто 8 байтов в длину.Возможно, вы неправильно понимаете, что он возвращает, особенно если он встречает EOF и возвращает -1-1 - это возвращаемое значение, когда он встречает EOF, а не EOF, хотя обычно оба они одинаковы).

Более типичное использование:

char *buffer = 0;
size_t buflen = 0;

ssize_t length_read = getline(&buffer, &buflen, stdin);

Не забудьте освободить buffer, даже если ввод не пройден;память может быть выделена, даже если она сразу получает EOF.

...