Подтвердить что ты не робот

Как читать строку из stdin, блокируя до тех пор, пока не будет найдена новая строка?

Я пытаюсь прочитать одну строку за раз, произвольной длины, из stdin в командной строке. Я не уверен, что смогу включить GNU readline и предпочитаю использовать библиотечную функцию.

Документация, которую я прочитал, предполагает, что getline должен работать, но в моих экспериментах он не блокируется. Моя примерная программа:

#include <stdio.h>
int main()
{
    char *line = NULL;
    if (getline(&line, NULL, stdin) == -1) {
        printf("No line\n");
    } else {
        printf("%s\n", line);
    }
    return 0;
}

создает No line, что делает его непригодным для приема пользовательского ввода.

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

4b9b3361

Ответ 1

Попробуйте этот патч

char *line = NULL;
+size_t size;
+if (getline(&line, &size, stdin) == -1) {
-if (getline(&line, 0, stdin) == -1) {
    printf("No line\n");
} else {

Ответ 2

Я смог воспроизвести "неблокирующее" поведение на getline:

#include <stdio.h>
#include <stdlib.h>

int main()
{
        char    *buffer;
        size_t  n = 1024;
        buffer = malloc(n);
        return getline(&buffer, &n, stdin);
}

getline(&buffer.... Если я назначу NULL на buffer, он снова блокирует (как рекламируется) и сохраняет строку в недавно выделенном буфере.

Но если я пишу

getline(NULL, &n, stdin);

тогда getline завершается сбой и, похоже, не блокируется. Вероятно, неверный n или указатель файла может привести к такому же поведению. Возможно, это проблема?