Если вводить обычные символы - то в обоих компилятора обе функции работают идентично. После ввода обычного печатного символа и нажатия Enter в потоке появляются два символа: введённый символ и символ новой строки. fscanf() и fgetc() читают сначала первый символ, потом второй. Это ок. Но с Ctrl+Z это не работает.
После ввода Ctrl+Z и нажатия Enter, если я правильно понимаю, в потоке появляется только EOF и символ новой строки. Если fscanf читает EOF, то она не будет изменять содержимое переменной c. Но почему gcc не требует ввод ещё одного символа новой строки, а msvc - требует?
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
void test1 () {
puts ( "test1" );
signed char c = 0;
c = fgetc ( stdin );
fprintf ( stdout, "1: %d\n", c );
c = fgetc ( stdin );
fprintf ( stdout, "2: %d\n", c );
}
void test2 () {
puts ( "test2" );
signed char c = 0;
fscanf ( stdin, "%c", &c );
fprintf ( stdout, "1: %d\n", c );
fscanf ( stdin, "%c", &c );
fprintf ( stdout, "2: %d\n", c );
}
int main ( void ) {
//test1 ();
test2 ();
return 0;
}
stream: Ctrl+Z Enter Ctrl+Z Enter
gcc:
test2
^Z
1: 0
^Z
2: 0
stream: Ctrl+Z Enter Enter
msvc:
test2
^Z
1: 0
2: 10