Poiché scanf
restituisce il valore EOF (che è -1) alla fine del file, il ciclo come scritto è corretto. Viene eseguito finché l'input contiene un testo corrispondente a %d
e si arresta al primo non corrispondente o alla fine del file.
Sarebbe stato più chiaro a colpo d'occhio se scanf
si aspettavano più di un ingresso ....
while (scanf("%d %d", &x, &y)==2) { ... }
uscirebbe dal ciclo quando la prima volta è stato in grado di abbinare due valori, sia a causa di fine del file di immagine (scanf
restituisce EOF (che è -1)) o errore di ingresso corrispondenti (ad esempio l'ingresso xyzzy 42
non corrisponde %d %d
così scanf
fermate primo guasto e restituisce 0 senza scrivere a uno o x
y
) quando restituisce un valore inferiore a 2.
Ovviamente, scanf
è non il tuo amico quando analizza l'input reale da umani normali. Ci sono molte insidie nella gestione dei casi di errore.
Edit: Corretto un errore: scanf
rendimenti EOF
sulla fine del file, o un intero non negativo contando il numero di variabili è impostata correttamente.
Il punto chiave è che poiché qualsiasi valore diverso da zero è TRUE
in C, non riuscire a testare correttamente il valore restituito in un ciclo come questo può facilmente portare a comportamenti imprevisti.In particolare, while(scanf(...))
è un ciclo infinito a meno che non incontri il testo di input che non può essere convertito in base al suo formato.
E non posso sottolineare abbastanza fortemente che scanf
è non tuo amico. Una combinazione di fgets
e sscanf
potrebbe essere sufficiente per alcuni semplici parsing, ma anche in questo caso è facilmente sopraffatta da casi limite ed errori.
Sì, sembra piuttosto ridondante per me ... – tzaman