¿Cuál es el propósito de poner un espacio en scanf como este scanf (“% c”, & ch) en lugar de scanf (“% c”, & ch)?

¿Cuál es el propósito de poner un espacio en scanf como este?

 scanf(" %c",&ch) 

en lugar de

 scanf("%c",&ch)? 

Además, ¿qué es el búfer de entrada en fflush(stdin) ?

Porque el espacio antes de %c ignora todos los espacios en blanco. *scanf familia de funciones de *scanf ignora todos los espacios en blanco antes de cualquier % de forma predeterminada, excepto %c , %[ y %n . Esto se menciona en C11 en:

7.21.6.2.8

Los caracteres de espacios en blanco de entrada (según lo especificado por la función de espacio de emisión) se omiten, a menos que la especificación incluya un especificador [, c, o n].

Para completar, aquí está la parte que dice que todos los espacios en blanco se ignorarán:

7.21.6.2.5

Una directiva compuesta por caracteres de espacios en blanco se ejecuta leyendo la entrada hasta el primer carácter que no está en espacios en blanco (que permanece sin leer), o hasta que no se puedan leer más caracteres. La directiva nunca falla.


Con respecto a su segunda pregunta, fflush(stdin) causa un comportamiento indefinido y no debe usarse (énfasis mío):

7.21.5.2.2

Si la secuencia apunta a una secuencia de salida o a una secuencia de actualización en la que no se ingresó la operación más reciente, la función fflush hace que los datos no escritos para esa secuencia se entreguen al entorno del host y se escriban en el archivo; de lo contrario, el comportamiento es indefinido .

¿Cuál es el propósito de poner un espacio en scanf como este scanf (“% c”, & ch) en lugar de scanf (“% c”, & ch)?

De modo que scanf ignoraría todos los espacios antes de que se encuentre el primer carácter sin espacio en la secuencia.

Además, ¿qué es el búfer de entrada en fflush (stdin)?

Lo que ingrese en la consola existirá en la secuencia stdin .

Sin embargo, no descargue esa secuencia, es un comportamiento indefinido . Si desea descartar los caracteres ingresados ​​después de llamar a scanf , puede leerlos y descartarlos.

El espacio en el scanf en este caso le dice a scanf que ignore los caracteres de espacio en blanco al comienzo del carácter que leyó. Aún así, si no hay espacios en blanco delante del carácter, el código funcionará y leerá el carácter correctamente.

No estoy seguro de lo que está preguntando en su última pregunta, pero stdin es el flujo de entrada estándar para su progtwig.

 scanf(" %c",&ch); 

Según la página del manual ,

El espacio en blanco (como espacios en blanco, tabs o nuevas líneas) en la cadena de formato coincide con cualquier cantidad de espacio en blanco, incluyendo ninguno , en la entrada.

Stdin es una entrada estándar. El usuario ingresa los datos para el progtwig, primero se almacena en un búfer y luego, cuando el progtwig solicita transferencias de datos mediante el uso de la operación de lectura, los datos se ponen a disposición del progtwig. (utilizando scanf etc).

Hace un tiempo tuve el mismo problema en el que si intentaba leer una variable utilizando scanf ("%c", &ans); No leería nada. Por lo tanto, me di cuenta de que se estaba leyendo el carácter \n de la última entrada.

Por lo tanto, haciendo scanf (" %c", &ans); resuelto mi problema

Aunque, no pude entender claramente tu segunda pregunta.

Solo para dar un espacio desde el último objeto, si no, por ejemplo, una cadena, todo estará junto sin espacios entre ellos.