No use fflush, use esta función en su lugar:
#include <stdio.h>
void clean_stdin(void)
{
int c;
do {
c = getchar();
} while (c != '\n' && c != EOF);
}
fflush(stdin)
depende de la implementación, pero esta función siempre funciona. En C, se considera una mala práctica usar fflush(stdin)
.
El comportamiento de fflush
no está definido para flujos de entrada (estándar en línea de 2011):
7.21.5.2 Elfflush
función
Sinopsis
1Descripción#include <stdio.h> int fflush(FILE *stream);
2 Si el flujo apunta a un flujo de salida o un flujo de actualización en el que no se ingresó la operación más reciente, elfflush
La función hace que los datos no escritos de esa transmisión se entreguen al entorno host para que se escriban en el archivo; de lo contrario, el comportamiento no está definido.
3 Sistream
es un puntero nulo, elfflush
La función realiza esta acción de vaciado en todos los flujos cuyo comportamiento se definió anteriormente.
Devoluciones
4Elfflush
La función establece el indicador de error para la secuencia y devuelve EOF si se produce un error de escritura; de lo contrario, devuelve cero.
Enfrenté el mismo problema mientras trabajaba en LINUX y una solución alternativa a este problema puede ser que definas un carácter ficticio, digamos char dummy;
y pon un scanf()
para escanearlo justo antes de que tenga lugar la entrada real. Esto funcionó para mí. Espero que funcione para ti también.
Uno que siempre funciona en Linux:
#include <termios.h>
#include <unistd.h>
void clean_stdin()
{
int stdin_copy = dup(STDIN_FILENO);
/* remove garbage from stdin */
tcdrain(stdin_copy);
tcflush(stdin_copy, TCIFLUSH);
close(stdin_copy);
}
Puedes usar tcdrain y tcflush no solo para entrada/salida/err fd.