Отличить EOF от ошибки для функции Getchar()

Перепишите программу, чтобы отличать EOF от ошибки для функции Getchar(). Другими словами, getchar() возвращает как во время ошибки, так и в конце файла EOF, нужно различать это, ввод не должен быть через FILE STREAM и обрабатывать ошибки функции putchar().

#include <stdio.h>
  
int main() { 

    long nc;
    nc = 0;
    while (getchar() != EOF)
    ++nc;
    printf ("%ld\n", nc);
    
  }

person Qualcomm    schedule 15.07.2020    source источник
comment
Проверьте либо feof, либо ferror после возврата EOF.   -  person HolyBlackCat    schedule 15.07.2020
comment
Но feof и ferror разве это не только для FILE STREAM?   -  person Qualcomm    schedule 15.07.2020
comment
Используйте stdin вместо файла.   -  person HolyBlackCat    schedule 15.07.2020
comment
@PP Хотя я на самом деле не оспариваю ваше закрытие как дубликат, в этом вопросе есть дополнительная проблема, связанная с необходимостью использовать stdin в качестве аргумента FILE*, что неочевидно из любой цели дублирования .   -  person Adrian Mole    schedule 15.07.2020


Ответы (1)


Вы можете проверить возвращаемые значения либо feof(), либо ferror() (или оба), используя stdin в качестве аргумента FILE*:

#include <stdio.h>
  
int main() { 

    long nc;
    nc = 0;
    while (getchar() != EOF) ++nc;
    printf ("%ld\n", nc);
    if (feof(stdin)) printf("End-of file detected\n");
    else if (ferror(stdin)) printf("Input error detected\n");
//  Note: One or other of the above tests will be true, so you could just have:
//  else printf("Input error detected\n"); // ... in place of the second.
  }
person Adrian Mole    schedule 15.07.2020
comment
Вы всегда должны получить один или другой, поэтому else if (...), вероятно, можно заменить только else. - person HolyBlackCat; 15.07.2020
comment
@HolyBlackCat Да, действительно (см. редактирование). Однако я хотел показать использование обоих вызовов функций. - person Adrian Mole; 15.07.2020
comment
Педантично: ни то, ни другое не может быть правдой на необычных платформах (некоторые старые графические процессоры), которые используют unsigned char того же размера, что и int. Но мало нужно кодировать для этой аберрации. Возможно получить оба значения true, если код был getchar(); while (getchar() != EOF) ++nc; из-за ошибки ввода в первом и конца файла в следующем. - person chux - Reinstate Monica; 15.07.2020