Dado que scanf
devuelve el valor EOF (que es -1) al final del archivo, el ciclo como está escrito es correcto. Se ejecuta siempre que la entrada contenga texto que coincida con %d
, y se detiene en el primer archivo que no coincide o al final del archivo.
Hubiera sido más claro de un vistazo si scanf
estaban esperando más de una entrada ....
while (scanf("%d %d", &x, &y)==2) { ... }
sería salir del bucle cuando la primera vez fue incapaz de igualar dos valores, ya sea debido a final de final de archivo del archivo (scanf
rendimientos EOF (que es -1)) o en error de entrada a juego (por ejemplo, la entrada de xyzzy 42
no coincide %d %d
así scanf
paradas en el primer fallo y devuelve 0 sin escribir a cualquiera de x
o y
) cuando devuelve algún valor menor que 2.
Por supuesto, scanf
es no tu amigo al analizar la entrada real de humanos normales. Hay muchos escollos en su manejo de casos de error.
Editar: corregido un error: scanf
rendimientos EOF
en el final del archivo, o un número entero no negativo contando el número de variables que se marcó con éxito.
El punto clave es que, dado que cualquier valor distinto de cero es TRUE
en C, si no se prueba el valor de retorno correctamente en un bucle como este, se puede generar un comportamiento inesperado.En particular, while(scanf(...))
es un bucle infinito a menos que encuentre texto de entrada que no se puede convertir de acuerdo con su formato.
Y no puedo enfatizar lo suficiente que scanf
es no su amigo. Una combinación de fgets
y sscanf
puede ser suficiente para un análisis simple, pero incluso así es fácilmente abrumado por casos extremos y errores.
Sí, parece bastante redundante para mí ... – tzaman