2016-09-23 7 views
2

Скажем, у меня есть следующие ...почему использование EOF, чтобы проверить, если STDIN буфер очищается

int main() {  
    char name [5] = ""; 
    char c; 
    printf("Enter a name: "); 
    fgets(name,5,stdin); 
    while ((c = getchar()) != '\n'); 
    printf("Exiting...); 
    getchar(); 
    return 0; 
} 

Петля в то время как очистит буфер STDIN, но я видел цикл сделано, как это, а также ...

while ((c = getchar()) != '\n' && c != EOF); 

Мне интересно, есть ли разница между 2 ??? Отличается ли тестирование EOF?

+0

Видя, что 'fgets' читает' newline' в любом случае, что осталось прочитать? –

+0

Ничего ... интересно, почему я видел его в Интернете где-то еще? –

+0

Глядя еще раз на 'char name [5];' вполне возможно, что * есть *, чтобы читать, но вам нужно только очистить ввод, если в конце 'name' нет' новой строки'. –

ответ

2

Мне интересно, есть ли разница между 2 ??? Отличается ли тестирование EOF?

Да, тестирование c != EOF имеет огромную разницу. getchar() возвращает EOF в том случае, если он обнаруживает ошибку или конец файла на стандартном входе. Оба они вполне возможны. Как только getchar() возвращает EOF, он, скорее всего, снова вернет EOF при каждом последующем вызове, поэтому версия, которая не тестирует EOF, рискует попасть в бесконечный цикл.

+0

как вы можете получить EOF перед символом новой строки? вы нажмете enter ... символ новой строки перед EOF –

+1

Некоторые редакторы, создавая файл с одной строкой, оставьте новую строку. Или оставьте новую строку на линии _final_. Технически это неправильно, но это происходит, и программа должна иметь возможность справиться с этим. –

+0

@ YusufJama, вход может быть перенаправлен из файла, который не содержит новую строку. Или введенное имя может быть меньше пяти символов, и в этом случае 'fgets()' будет читать новую строку. Есть и другие возможности. –