использование fgets () с вводом stdin: ^ D не передает сигнал EOF - PullRequest
0 голосов
/ 13 октября 2018

Я пишу программу на C на своем MacBook, которая использует Mojave, и я пытаюсь использовать fgets (), чтобы получить строку из stdin.

Мой код компилируется - единственная проблема заключается в том, что когдаЯ запускаю программу в терминале, после вызова функции fgets () и ввода нужного ввода я не могу понять, как сигнализировать о конце ввода, чтобы программа могла продолжить работу.

Я признаю, что у многих людей была эта проблема, и на этом сайте есть много страниц, посвященных ее решению.Но ни одно из решений (которые я понял) не сработало для меня.Я прочитал это и это , но это не помогает.

Я проверил документацию для fgets (), которая гласит:

"fgets () считывает из потока не более одного размера символов меньше размера и сохраняет их в буфере, указанном s. Чтение останавливается после * EOF * или новой строки. Если читается новая строка, этосохранен в буфере. Завершающий нулевой байт (\ 0) сохраняется после последнего символа в буфере. "- с этой страницы .

Ввод 'stty all' в терминале показывает, что EOF действительно соответствует ^ D.Я пытался ввести ^ D дважды, три раза, нажимая Enter, затем ^ D, ^ D, затем Enter и т. Д. И т. Д. Кажется, ничего не работает.

Что я делаю не так?Вот соответствующий бит кода (первоначально от здесь , в разделе «Указатели на структуры, содержащие указатели»):

#include <stdio.h>

typedef struct
{
    char name[21];
    char city[21];
    char phone[21];
    char *comment;
} Address;


int main(void)
{
    Address s;
    char comm[100];

    fgets(s.name, 20, stdin);
    fgets(s.city, 20, stdin);
    fgets(s.phone, 20, stdin);
    fgets(comm, 100, stdin);

    return 0;
}

1 Ответ

0 голосов
/ 13 октября 2018

Вы не проверяете возвращаемое значение fgets(): если вы действительно сигнализируете об окончании файла с терминала, последующие вызовы fgets() вернут NULL и массивы назначения останутся неинициализированными.

В вашем коде нет ничего, что мешало бы работе программы в конце файла.Просто нажмите ввод после каждого фрагмента ввода.Как вы думаете, зачем вам нужно сигнализировать о конце файла ?

...