Почему поведение fscanf ( stdin, «%c», &c ) различается при чтении EOF в msvc и gcc?

Поведение функции fscanf при чтении EOF из stdin действительно может отличаться в MSVC и GCC из-за различий в их реализации стандарта C.

В стандарте C нет явного определения для того, что должна делать fscanf при чтении EOF, поэтому это оставляется на усмотрение конкретной реализации компилятора.

В GCC, при чтении EOF с помощью fscanf, функция вернет значение EOF, а переменная c останется неизменной. То есть, c будет содержать последнее считанное из stdin значение, а значение EOF будет указывать на конец файла или ошибку чтения.

В MSVC, с другой стороны, при чтении EOF с помощью fscanf, функция не только вернет значение EOF, но также установит значение c в EOF. То есть, c будет содержать значение EOF.

Такое различие в поведении может создать некоторую путаницу, если в коде предполагается определенное поведение. Поэтому, для того чтобы код был переносимым между разными компиляторами, рекомендуется явно проверять возвращаемое значение fscanf и наличие ошибки чтения, а не полагаться на значение c при чтении EOF. Например:

int result = fscanf(stdin, "%c", &c);
if (result == EOF) {
    if (feof(stdin)) {
        // Конец файла
    } else if (ferror(stdin)) {
        // Ошибка чтения
    }
} else {
    // Обработка успешного чтения
}