Ceteris paribus (dati ben formati, buone pratiche di buffering e cosa no), c'è un motivo per cui preferisco effettuare il ciclo mentre il ritorno di scanf
è 1, anziché !EOF
? Potrei aver letto questo da qualche parte, o qualsiasi altra cosa, ma potrei aver sbagliato anch'io. che cosa pensano le altre persone?Mentre scanf! = EOF o scanf == 1?
risposta
scanf
restituisce il numero di elementi convertiti con successo ... o EOF in caso di errore. Quindi codifica la condizione nel modo in cui ha senso.
scanfresult = scanf(...);
while (scanfresult != EOF) /* while scanf didn't error */
while (scanfresult == 1) /* while scanf performed 1 assignment */
while (scanfresult > 2) /* while scanf performed 3 or more assignments */
esempio inventato
scanfresult = scanf("%d", &a);
/* type "forty two" */
if (scanfresult != EOF) /* not scanf error; runs, but `a` hasn't been assigned */;
if (scanfresult != 1) /* `a` hasn't been assigned */;
Edit: aggiunto un altro esempio più artificioso
int a[5], b[5];
printf("Enter up to 5 pairs of numbers\n");
scanfresult = scanf("%d%d%d%d%d%d%d%d%d%d", a+0,b+0,a+1,b+1,a+2,b+2,a+3,b+3,a+4,b+4);
switch (scanfresult) {
case EOF: assert(0 && "this didn't happen"); break;
case 1: case 3: case 5: case 7: case 9:
printf("I said **pairs of numbers**\n");
break;
case 0:
printf("What am I supposed to do with no numbers?\n");
break;
default:
pairs = scanfresult/2;
dealwithpairs(a, b, pairs);
break;
}
Questo è solido. Grazie. –
+1 per un buon esempio di codice –
Dipende da cosa si vuole fare con ingresso malformati - se il vostro modello isn di scansione Corrispondenza, è possibile ottenere 0
restituito. Quindi, se gestisci il caso al di fuori del ciclo (ad esempio se lo tratti come un errore di input), confronta con 1
(o comunque molti elementi ci sono nella tua chiamata scanf).
Da http://www.cplusplus.com/reference/clibrary/cstdio/scanf/
In caso di successo, la funzione restituisce il numero di elementi successo leggere. Questo conteggio può corrispondere al numero previsto di letture o meno, anche a zero, se si verifica un errore di corrispondenza . Nel caso di un errore di input prima che qualsiasi dato possa essere letto correttamente, EOF è restituito.
L'unico modo per essere sicuri di aver letto il numero di elementi previsti è quello di confrontare il valore restituito con quel numero.
Il testo citato non è corretto. Gli elementi letti (ma non memorizzati) utilizzando formati come '% * d' sono ** non conteggiati ** nel valore di ritorno. www.cplusplus.com non sembra essere una buona fonte per informazioni accurate sulla libreria standard C. Se desideri un riferimento online a cui puoi collegarti, POSIX è autorevole; per le funzioni C standard con estensioni POSIX, ha le parti di estensione contrassegnate nei blocchi "CX". Vedi http://www.opengroup.org/onlinepubs/9699919799/functions/scanf.html –
- 1. Scanf Confusione
- 2. C: Più scanf di, quando entro un valore per una scanf salta il secondo scanf
- 3. scanf Getting Skipped
- 4. argomenti invertito a scanf()
- 5. Cercare l'equivalente di scanf
- 6. errore di segmentazione utilizzando scanf
- 7. Errore GOLang Scanf
- 8. scanf() salta variabile
- 9. Perché scanf richiede &?
- 10. getchar_unlocked() VS scanf() VS cin
- 11. Scanf unsigned char in esadecimale
- 12. Differenza tra diversi formati scanf
- 13. scanf senza argomenti aggiuntivi in C
- 14. Utilizzo di scanf con NSStrings
- 15. Leggi stringa C++ con scanf
- 16. Simple C scanf non funziona?
- 17. C scanf equivalente in nodejs
- 18. Rust ha qualcosa come scanf?
- 19. Differenza tra scanf() e fgets()
- 20. Utilizzando scanf in un ciclo while
- 21. utilizzo del valore di ritorno di scanf
- 22. Utilizzare scanf con le espressioni regolari
- 23. Perché gets() è più pericoloso di scanf()?
- 24. In che modo scanf determina se bloccare?
- 25. Parsing input con scanf in C
- 26. Perché scanf deve prendere l'indirizzo dell'operatore
- 27. Quale funzione scanf in c restituisce?
- 28. Quando devo usare e commerciale con scanf()
- 29. Come utilizzare scanf() senza includere stdio.h
- 30. lettura ingresso separato da virgole con scanf
+1 per impressionante introduzione latina –
Abbastanza simile: http://stackoverflow.com/questions/2970880/using-scanf-in-a-while-loop –
@Steve: heh. L'Academia ti fa questo ... mai notato, e un bel tocco in corsivo ... tu ovviamente vieni anche dal mondo accademico. :) –