2015-03-22 2 views
0

Так что я прочитал в строке с помощью fgetsКак вы обнаруживаете ctrl + D в C?

line = fgets(l, BUFSIZ, stdin); 

И я от того, что я понимаю, контроль + d является EOF, поэтому я попытался

if(line[0] == EOF) 
    continue; 

, чтобы вернуться к началу цикла. Но это привело к segfaults ... Есть ли другой способ?

+2

Из справочной страницы 'fgets' в Linux: * fgets() возвращает s при успешном запуске и NULL при ошибке или при завершении файла, когда никакие символы не были прочитаны. * – hyde

+1

Ctrl-D является специфичным для операционной системы (не указано в стандарт C99). В Linux [Ctrl-D не является символом] (http://stackoverflow.com/a/24548128/841108), но обычно это * конец файла * ** условие ** –

ответ

5

Поскольку аппарат генерирует EOF на Ctrl + D, вы должны проверять fgets() для NULL, поскольку fgets() обязан вернуть NULL на конец файла.

line = fgets(l, BUFFSIZ, stdin) 
if (line == NULL) 
    continue; 

В коде, вы пытаетесь разыменования указателя, что это NULL приводит к сегментации.

0

Проверьте feof() на потоке или выполните дополнительное чтение и проверку для NULL в line.

Вы получаете segfault, потому что lineNULL, когда вы пытаетесь сравнить его с EOF.

Смежные вопросы