2011-06-14 10 views
9

poco me topé con un caso curioso (al menos para mí, ya que no había encontrado antes) .. Considere el código simple a continuación: -scanf() comportamiento curioso!

int x; 
scanf("%d",&x); 
printf("%d",x); 

El código anterior lleva un número entero de entrada normal y muestra la resultado como se esperaba ..

Ahora, si modifico el código anterior a lo siguiente: -

int x; 
scanf("%d ",&x);//notice the extra space after %d 
printf("%d",x); 

Esto toma en otro aporte adicional antes de dar el resultado de la sentencia printf .. no lo hago entender por qué un espacio resu lts en el cambio de comportamiento de la scanf() .. ¿Alguien puede explicar esto a mí ....

+1

scanf es MALO y debe evitarse, por lo que digo I, y otros :): http: // stackoverflow.com/questions/456303/how-to-validate-input-using-scanf – Bukes

+0

@Bukes: sí, si no sabe cómo programar o leer la documentación, no debe usar C –

+1

@Chris Dodd - 'scanf' no puede distinguir entre nuevas líneas y otros espacios en blanco. Si desea un control preciso de su entrada, o la capacidad de recuperarse sanamente de los errores, no puede usar 'scanf' independientemente de lo bien que sepa C. –

Respuesta

8

De http://beej.us/guide/bgc/output/html/multipage/scanf.html:

La familia scanf() de funciones lee datos desde la consola o desde una secuencia de archivo, lo procesa y almacena los resultados de distancia en las variables suministrados por el usuario en la lista de argumentos.

La cadena de formato es muy similar a la de printf() en que puede decir que lea "% d", por ejemplo para un int. Pero también tiene capacidades adicionales, sobre todo que puede consumir otros caracteres en la entrada que especifique en el formato de cadena.

Lo que está sucediendo es scanf es un patrón que coincide con la cadena de formato (algo así como una expresión regular). scanf consume el texto de la entrada estándar (por ejemplo, la consola) hasta que todo el patrón coincida.

En su segundo ejemplo, scanf lee un número y lo almacena en x. Pero aún no ha llegado al final de la cadena de formato, todavía queda un carácter de espacio. Así que scanf lee los caracteres de espacios en blanco adicionales de la entrada estándar para (intentar) hacer coincidirlos.

3

Desde el man page:

La cadena de formato consiste en una secuencia de directivas que describen cómo procesar la secuencia de caracteres de entrada. Si se produce un error en el procesamiento de una directiva , no se lee ninguna entrada adicional, y se devuelve scanf(). Un "error" puede ser cualquiera de los siguientes: error de entrada, lo que significa que caracteres de entrada no estaban disponibles, o error coincidente, lo que significa que la entrada fue inapropiada (ver a continuación).

A directive is one of the following: 

    ?  A sequence of white-space characters (space, tab, newline, etc; 
     see isspace(3)). This directive matches any amount of white 
     space, including none, in the input. 
+0

Tenga en cuenta que esto significa que cuando hay un espacio en el formato, scanf entrada de lectura consumir y descartar caracteres de espacio en blanco hasta que encuentre un carácter que no sea de espacio en blanco. Dejará ese personaje como el siguiente para ser leído y luego volverá. –

0

man scanf

[...] Una secuencia de caracteres de espacio en blanco (espacio, tabulación, nueva línea, etc .; ver isspace (3)). Esta directiva coincide con cualquier cantidad de espacio blanco , incluyendo ninguno, en la entrada.

+2

Y la respuesta es? –

+1

@Christian Rau: Se trata de la coincidencia de patrones. Un espacio 'coincide con cualquier cantidad de espacio en blanco, [...] en la entrada'. Parece una respuesta. –