Поскольку scanf
возвращает значение EOF (равное -1) в конце файла, цикл, как написано, является правильным. Он выполняется до тех пор, пока ввод содержит текст, соответствующий %d
, и останавливается либо на первом несоответствии, либо в конце файла.
Было бы яснее с первого взгляда, если бы scanf
ожидал более одного ввода ...
while (scanf("%d %d", &x, &y)==2) { ... }
выйдет из цикла, когда в первый раз он не сможет сопоставить два значения, либо из-за конца файла в конце файла (scanf
возвращает EOF (что равно -1)), либо из-за ошибки сопоставления ввода (например, ввода xyzzy 42
не соответствует %d %d
, поэтому scanf
останавливается при первом сбое и возвращает 0 без записи либо в x
, либо y
), когда возвращается значение, меньшее 2.
Конечно, scanf
это , а не ваш друг, когда вы анализируете реальный вклад от нормальных людей. Есть много подводных камней при обработке ошибок.
Редактировать: Исправлена ошибка: scanf
возвращает EOF
в конце файла или неотрицательное целое число, подсчитывающее количество успешно установленных переменных.
Ключевым моментом является то, что, поскольку любое ненулевое значение равно TRUE
в C, неправильная проверка возвращаемого значения в цикле, подобном этому, может легко привести к неожиданному поведению. В частности, while(scanf(...))
является бесконечным циклом, если он не встречает входной текст, который не может быть преобразован в соответствии с его форматом.
И я не могу особо подчеркнуть, что scanf
не ваш друг. Комбинация fgets
и sscanf
может быть достаточной для простого анализа, но даже в этом случае она легко перегружается крайними случаями и ошибками.