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 Lefflush
fonction
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, lefflush
la 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 Sistream
est un pointeur nul, lefflush
La fonction effectue cette action de vidage sur allstreams pour lesquels le comportement est défini ci-dessus.
Retours
4Lefflush
La 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.