Ceteris paribus (datos bien formateados, buenas prácticas de almacenamiento en búfer y qué no), ¿hay alguna razón por la que prefiera repetir mientras el retorno de scanf
es 1, en lugar de !EOF
? Puede que haya leído esto en alguna parte, o lo que sea, pero también puedo estar equivocado. ¿Qué piensa otra gente?While scanf! = EOF o scanf == 1?
Respuesta
scanf
devuelve la cantidad de elementos convertidos con éxito ... o EOF por error. Así que codifica la condición de la manera en que tiene sentido.
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 */
ejemplo contribuido
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 */;
Editar: se ha añadido otro ejemplo más artificiosa
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;
}
Esto es sólido. Gracias. –
+1 para un bonito código de ejemplo –
depende de lo que quiere hacer con la entrada malformada - si su patrón de ISN exploración 'emparejado, puede obtener 0
devuelto. Por lo tanto, si maneja ese caso fuera del bucle (por ejemplo, si lo trata igual que un error de entrada), entonces compare con 1
(o la cantidad de elementos que haya en su llamada scanf).
De http://www.cplusplus.com/reference/clibrary/cstdio/scanf/
En caso de éxito, la función devuelve el número de elementos con éxito leer. Este recuento de puede coincidir con el número esperado de lecturas o menos, incluso cero, si ocurre una coincidencia de . En el caso de una falla de entrada antes de que cualquier dato pudiera leerse con éxito, se devuelve EOF .
La única forma de asegurarse de leer el número de elementos es comparar el valor de retorno con ese número.
El texto entre comillas es incorrecto. Los elementos que se leen (pero no se almacenan) utilizando formatos como '% * d' ** no se cuentan ** en el valor de devolución. www.cplusplus.com no parece ser una buena fuente de información precisa sobre la biblioteca estándar de C. Si desea una referencia en línea a la que pueda vincular, POSIX tiene autoridad; para funciones C estándar con extensiones POSIX, tiene las partes de extensión marcadas en bloques "CX". Ver http://www.opengroup.org/onlinepubs/9699919799/functions/scanf.html –
- 1. While-loop ignora scanf la segunda vez
- 2. ¿Cómo se lee scanf hasta EOF en C?
- 3. El uso de scanf en un bucle while
- 4. ¿Scanf() toma '\ n' como entrada sobrante del scanf anterior()?
- 5. Char * p, y scanf
- 6. C: de múltiples scanf, cuando entro en un valor para uno scanf se salta la segunda scanf
- 7. scanf asignación dinámica
- 8. ¿Por qué Scanf requiere &?
- 9. scanf() comportamiento curioso!
- 10. scanf Cppcheck advertencia
- 11. Usando scanf con NSStrings
- 12. scanf() (C Language) me confundió
- 13. ¿Qué significa espacio en scanf?
- 14. usando scanf en C/C++
- 15. Simple C scanf no funciona?
- 16. Cómo usar Scanf en NASM?
- 17. no les importa en scanf
- 18. Analizando entrada con scanf en C
- 19. getchar no se detiene al usar scanf
- 20. C - scanf() vs gets() vs fgets()
- 21. ¿Qué son los identificadores de formato scanf ("% * s") y scanf ("% * d")?
- 22. Dynamic String Input - using scanf ("% as")
- 23. ¿Cómo funciona la función scanf en C?
- 24. ¿por qué ruby scanf es tan lento?
- 25. ¿Cómo prevenir scanf causando un desbordamiento de buffer en C?
- 26. En busca de Go equivalente de scanf
- 27. Cuándo usar printf/scanf vs cout/cin?
- 28. ¿Qué función scanf en c devuelve?
- 29. Entrada en C. Scanf before gets. Problema
- 30. ¿Obtenga scanf para salir cuando lee una nueva línea?
+1 for awesome Introducción en latín –
Algo relacionado: http://stackoverflow.com/questions/2970880/using-scanf-in-a-while-loop –
@Steve: heh. La Academia te hace eso ... nunca lo notaste, y un bonito toque en cursiva ... obviamente, tú también vienes de la academia. :) –