Podemos solucionar este problema usando una función como la siguiente:
void fflushin() { int d, i=0; d = stdin->_IO_read_end - stdin->_IO_read_ptr; for(i=0; i<d; i++) getchar(); }
La operación stdin->_IO_read_end - stdin->_IO_read_ptr nos permite calcular el número de caracteres que quedan almacenados en la entrada estándar a partir de la posición actual del puntero (osea, los caracteres sobrantes), después solo tenemos que ejecutar la función getchar() tantas veces como caracteres haya, para limpiar así la entrada estándar y deshacernos de esos caracteres no deseados.
EJEMPLO DE USO
Una situación muy habitual en la que es necesario usar una función como la anterior es la siguiente:
#include <stdio.h> main() { int num; printf("\nInserta un numero: "); scanf("%d", &num); printf("numero insertado: %d", num); printf("\n\nPulsa enter para continuar\n\n"); getchar(); }
En el programa anterior tenemos la intención de usar la función getchar() para pausar la ejecución del programa hasta que el usuario pulse la tecla enter, pero debido a la función scanf se queda un caracter sin leer en la entrada estándar (el caracter de nueva linea), caracter que leerá la función getchar() sin detenerse como teníamos previsto.
Para solucionarlo lo único que tenemos que hacer es limpiar los caracteres no deseados que se han quedado en la entrada estándar usando la función fflushin() que hemos definido:
#include <stdio.h> void fflushin() { int d, i=0; d = stdin->_IO_read_end - stdin->_IO_read_ptr; for(i=0; i<d; i++) getchar(); } main() { int num; printf("\nInserta un numero: "); scanf("%d", &num); printf("numero insertado: %d", num); printf("\n\nPulsa enter para continuar\n\n"); fflushin(); getchar(); }
Y de esta manera el programa funciona tal y como habíamos planeado ya que la función fflushin() ha limpiado esos caracteres no deseados de la entrada estándar y por lo tanto la función getchar() detiene la ejecución del programa hasta que el usuario pulse la tecla enter.
Saludos =)