Diferencia entre scanf (“% c”, & c) y scanf (“% c”, & c)

Considere el siguiente fragmento de código C:

#include  int main() { int a; char c; scanf("%d",&a); scanf("%c",&c); printf("int=%d\n",a); printf("char=%c\n",c); } 

Solo puedo ingresar el número entero y no el carácter. La salida es simplemente el valor entero y no se genera ningún valor para la segunda instrucción printf.

Sin embargo, si uso un espacio antes del especificador de formato:

 scanf(" %c",&c); 

Funciona como se esperaba. ¿Por qué es este el caso?

Alguien me dijo que tiene algo que ver con borrar el buffer de entrada. ¿Alguien podría arrojar algo de luz sobre lo mismo?

La diferencia entre scanf("%c", &c1) y scanf(" %c", &c2) es que el formato sin el blanco lee el siguiente carácter, incluso si es en blanco, mientras que el que está en blanco omite el espacio en blanco (incluidas las nuevas líneas) y lee el siguiente carácter que no es espacio en blanco.

En un formato scanf() , un espacio en blanco, una pestaña o una nueva línea significa ‘omitir el espacio en blanco si hay alguna para omitir’. No borra directamente el búfer de entrada, pero sí come cualquier espacio en blanco que tenga un aspecto similar al de borrar el búfer de entrada (pero es bastante distinto de eso). Si está en Windows, usar fflush(stdin) borra el búfer de entrada (de espacio en blanco y caracteres de espacios en blanco); en Unix y de acuerdo con el estándar C, fflush(stdin) es un comportamiento indefinido.

Por cierto, si escribió el número entero seguido inmediatamente por un retorno de carro, la salida de su progtwig finaliza con dos líneas nuevas: la primera estaba en c la segunda en la cadena de formato. Por lo tanto, es posible que haya visto:

 $ ./your_program 123 int=123 char= $ 

Es decir, el scanf() lee la nueva línea como su entrada. Considere una entrada alternativa:

 $ ./your_program 123xyz int=123 char=x $ 

La entrada entera se detuvo cuando se lee la ‘x’; la entrada de caracteres, por lo tanto, lee la ‘x’.

Porque después de ingresar el número y presionar ENTER, la nueva línea permanece en el buffer y será procesada por el segundo scanf .

En resumen, guardaste una nueva línea en la variable c .

Sin embargo, si usa

 scanf(" %c",&c); // ^ 

el espacio consumirá la nueva línea, lo que hace que c sea ​​el valor que esperaba.

Debe pasar un puntero al objeto de datos especificado por la cadena de formato, por lo

 scanf("%c", c); 

en realidad pasará el valor de c, que a su vez podría causar un error del progtwig,

 scanf("%c", &c); 

pasará la dirección de c, permitiendo scanf para cambiar el valor de su copia.

El espacio después del% c lo forzará a buscar un personaje, Y LUEGO un espacio. Si no hay un espacio, no leerá el personaje