Поскольку scanf("%d")
попытается прочитать символы, представляющие число, а затем сохранить их в заданной переменной.
Он не сохраняет EOF
в число, если вы закрываете поток. В противном случае, как бы вы определили разницу между концом файла и вводом числового значения EOF
(-1).
scanf
вернет количество отсканированных элементов (которое будет равно нулю, если формат был неправильным, или EOF, если поток закрыт или произошли определенные ошибки). Он возвращает это как код возврата из функции scanf
, , а не через переменную-указатель, которую вы ей передали.
Вы должны только предполагать, что переменные (для которых вы передаете адреса) заполняются, если возвращаемое значение из scanf
говорит вам об этом.
Другими словами, вы ищете что-то вроде:
int rc = scanf ("%d", &num);
switch (rc) {
case EOF: {
printf ("EOF returned\n");
break;
}
case 0: {
printf ("No items scanned\n");
break;
}
default: {
printf ("Scanned %d\n", num);
break;
}
}