N'utilisez pas fflush, utilisez plutôt cette fonction :
#include <stdio.h>
void clean_stdin(void)
{
int c;
do {
c = getchar();
} while (c != '\n' && c != EOF);
}
fflush(stdin) dépend de l'implémentation, mais cette fonction fonctionne toujours. En C, il est considéré comme une mauvaise pratique d'utiliser fflush(stdin) .
Le comportement de fflush n'est pas défini pour les flux d'entrée (norme en ligne 2011) :
7.21.5.2 Lefflushfonction
Synopsis
1Description#include <stdio.h> int fflush(FILE *stream);
2 Si le flux pointe vers un flux de sortie ou un flux de mise à jour dans lequel l'opération la plus récente n'a pas été entrée, lefflushla fonction entraîne l'écriture dans le fichier de toutes les données non écrites pour ce flux à livrer à l'environnement hôte ; sinon, le comportement n'est pas défini.
3 Sistreamest un pointeur nul, lefflushLa fonction effectue cette action de vidage sur allstreams pour lesquels le comportement est défini ci-dessus.
Retours
4LefflushLa fonction définit l'indicateur d'erreur pour le flux et renvoie EOF si une erreur d'écriture se produit, sinon elle renvoie zéro.
J'ai rencontré le même problème en travaillant sur LINUX et une solution alternative à ce problème peut être que vous définissiez un caractère factice disons char dummy; et mettre un scanf() pour le scanner juste avant que votre entrée réelle ait lieu. Cela a fonctionné pour moi. J'espère que cela fonctionnera pour vous aussi.
Celui qui fonctionne toujours sous 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);
}
Vous pouvez utiliser tcdrain et tcflush pas seulement pour in/out/err fd.