Какое значение сохраняется в переменной аргумента, когда scanf(fscanf) встречает EOF?

int *ptr = malloc~
while (fscanf(fp, "%d", ptr++) != EOF)
    ;

Предполагая, что для ptr выделено достаточно памяти, что означает значение, хранящееся в *ptr, когда функция вызывает EOF? Я попытался использовать инструменты отладки в Visual Studio и обнаружил, что значение *ptr равно -33686019. Это мусорное значение? или ЭОФ?


person 장동욱    schedule 27.03.2017    source источник
comment
Неинициализированное значение, то есть мусорное значение. Также необходимо сохранить первый адрес.   -  person BLUEPIXY    schedule 27.03.2017
comment
Неопределенные. EOF возвращается только в том случае, если ошибка произошла до назначения первого входного аргумента.   -  person StoryTeller - Unslander Monica    schedule 27.03.2017
comment
Если, например, первый символ в файле не был цифрой, то зачем scanf (или его родственники) хранят что-нибудь? Если вы получаете EOF (или ноль!), то вы просто не можете предположить, что сохранено действительное значение.   -  person Some programmer dude    schedule 27.03.2017
comment
Кстати, когда вы используете ptr++ в качестве аргумента, помните, что вы теряете исходный указатель. После того, как вы выполните ptr++, вы больше не сможете вызывать free, передавая ptr, и позиция, в которой хранятся возможные данные, будет потеряна.   -  person Some programmer dude    schedule 27.03.2017
comment
Обратите внимание, что если во входных данных есть нецифровой, не пробельный символ (например, буква), то ваш цикл выйдет из-под контроля. Вы всегда должны обусловливать цикл ожидаемым количеством допустимых значений: while (fscanf(fp, "%d", ptr++) == 1 && ptr < end) ; (где end — это значение, назначенное изначально ptr, плюс количество выделенных int). Вам также необходимо сохранить значение ptr для последующего использования — если не для чего-то другого, то для free().   -  person Jonathan Leffler    schedule 27.03.2017


Ответы (1)


Когда scanf достигает EOF, значение не сохраняется по адресу, на который указывает ptr. Аналогично, если он возвращает 0. Вот почему канонический способ перебора ввода должен проверять возвращаемое значение scanf, например. с

if (fscanf(fp, "%d", &ptr_to_int) == 1) {
  /* successful conversion */
}
else {
  /* Unsuccesful conversion or EOF; use feof() to test which. */
}
person Jens    schedule 27.03.2017