2010-11-11 10 views
10

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?

+3

+1 for awesome Introducción en latín –

+0

Algo relacionado: http://stackoverflow.com/questions/2970880/using-scanf-in-a-while-loop –

+0

@Steve: heh. La Academia te hace eso ... nunca lo notaste, y un bonito toque en cursiva ... obviamente, tú también vienes de la academia. :) –

Respuesta

13

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; 
} 
+0

Esto es sólido. Gracias. –

+0

+1 para un bonito código de ejemplo –

1

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).

0

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.

+0

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 –