¿Por qué este C scanf se omite automáticamente?

Estoy enfrentando un problema relacionado con el scanf en C. Por favor, no marque esta pregunta como duplicada ya que he buscado mucho sobre este problema aquí y encontré muchos similares, pero no me respondieron exactamente.

Cuando corro esto:

 char c; int a, b; scanf("%d", &a); scanf("%c", &c); scanf("%d", &b); 

Luego, los dos primeros scanf funcionaron correctamente, pero el tercero se omite por completo. Busqué diferentes publicaciones en este foro sobre este problema y encontré mucha información, pero quiero saber algo más.

Ya encontré que la solución más fácil sería:

 scanf("%d %c %d", &a, &c, &b); 

Y otra solución podría estar utilizando:

 getchar(); 

Y también encontré que la razón detrás de mi problema es que escribe un nuevo carácter de línea \n en el búfer, por eso se omitió la tercera. Pero para continuar investigando, descubrí que cuando uso otro scanf de tipo char después del 2nd scanf , funciona. Eso significa que, en mi caso, el problema se produce si tomo una entrada de cualquier tipo integer después del tipo char . Una vez más, he visto que muchos otros tenían problemas al tener un caso opuesto, no podían recibir información de char después de integer . Ahora quiero que me aclaren los esquemas exactos que se admiten en C para scanf que es cuando me enfrentaré a problemas similares y por qué se puede escanear un char después de un char pero no un integer . Gracias a todos.

El especificador de formato "%d" incluye omitir los espacios en blanco iniciales. El formato "%c" no tiene eso, lee el siguiente carácter en el búfer de entrada sin importar qué tipo de carácter sea.

Si desea omitir los espacios en blanco iniciales utilizando el formato "%c" , debe indicar a scanf explícitamente que lo haga con un espacio en la cadena de formato, como por ejemplo " %c" .

Este es el mismo problema que “no se puede tomar una char después de un int “, con un pequeño giro.

Recuerde que cuando lee un int desde una entrada que usa scanf con el especificador de formato %d , los caracteres que representan el número se consumen, pero el separador que sigue no lo es. Considere un búfer que se vea así (uso guiones bajos para mostrar espacios):

 char 9 8 _ x _ 7 6 - - - - - - - position 0 1 2 3 4 5 6 
  • Antes de la primera llamada a scanf su búfer se coloca en cero.
  • Después de la primera llamada su búfer se coloca en 2.
  • Después de la segunda llamada, su búfer se coloca en 3, porque se lee el espacio para su char

Ahora el problema se aclara: el tercer scanf intenta leer un int , pero el búfer está en x , por lo que la lectura no es posible.