Замена getchar на fgetc или getc в while(getchar() != '\n');

Люди обычно упоминают

while( getchar() != '\n' )

когда дело доходит до очистки входного буфера или переполнения.

fgetc или getc также работают. Например:

while( fgetc(stdin) != '\n' )

и

while( getc(stdin) != '\n' )

Есть ли какая-то особая причина, по которой люди всегда используют getchar?

Есть ли недостатки в использовании fgetc или getc?


person GabesGates    schedule 22.10.2016    source источник


Ответы (2)


Люди предпочитают getchar только в тех случаях, когда они читают со стандартного ввода. Нет причин, по которым нельзя было бы заменить его на getc/fgetc, когда требуется чтение из файла.

При этом конструкция опасна, поскольку может привести к бесконечному циклу в ситуациях, когда во входном потоке нет '\n'. Например, если конечный пользователь закрывает поток с помощью Ctrl+D или Ctrl+Z, программа с цикл while, подобный вашему, никогда не выйдет. Вам нужно проверить EOF в цикле, который игнорирует ввод:

int ch;
while ((ch = getchar()) != '\n' && ch != EOF);
person Sergey Kalinichenko    schedule 22.10.2016

  • Если вы знаете, что читаете с stdin, используйте getchar.
  • Если вы читаете из произвольного указателя файла, используйте getc.
  • Если по какой-то неясной причине вам нужно убедиться, что вы вызываете настоящую функцию, а не макрос, используйте fgetc. (Для меня эти причины настолько неясны, что я никогда не вызываю fgetc и рекомендую использовать getc.)
person Steve Summit    schedule 22.10.2016