Cherche equivalent de fflush(stdin) pour linux

Fermé
Dosman Messages postés 1444 Date d'inscription mardi 1 mai 2012 Statut Contributeur Dernière intervention 26 septembre 2017 - Modifié par Dosman le 28/12/2014 à 21:32
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 28 déc. 2014 à 23:59
Bonjour,

Dans le cadre d'un projet, je dois faire un programme assez complexe pouvant être compilé sous windows, linux et mac.
Je programme sous windows pour le moment et j'utilise fflush(stdin) pour vider le buffer de lecture, sauf que cela ne marche que sous windows...
Après de longues recherches sur le net, j'ai trouvé quelques codes sensés être équivalents mais aucun ne marchent correctement...

Voici un petit code pour présenter mon problème :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void vider_buffer(void)
{
fflush(stdin);
}


int main(void)
{
char *buffer=calloc(100,sizeof(char));//buffer de lecture
printf("Entrez 0, 1 ou 2 : \n");
do
{
printf("Quel est votre choix ? ");
vider_buffer();//on vide le buffer de lecture
scanf("%99s",buffer);//on lit ce que l'utilisateur tape
vider_buffer();//on vide le buffer de lecture
}while(strcmp(buffer,"0")!=0 && strcmp(buffer,"1")!=0 && strcmp(buffer,"2")!=0);//tant que l'entree n'est pas correcte
printf("Bravo !\n");
return 0;
}


L'objectif est de remplacer le contenu de vider_buffer() par autre chose qui fasse la même chose.
J'ai déjà essayé pas mal de choses comme :
int c;
do c = getchar(); while ((c != EOF) && (c != '\n'));

Mais ça ne marche pas...
Il faudrait que quand l'utilisateur rentre "5 5" le programme redemande la saisie.

Quelqu'un pourrait-il m'aider ?
Merci.




"Moi je dis que le plus fort entre l'hippopotame et l'éléphant, c'est encore le rhinocéros !"

1 réponse

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 816
28 déc. 2014 à 23:59
Bonjour,

Tu peux oublier fflush(stdin); et ce, même sur windows.
fflush(stdin) a un comportement indéterminé.

Pour vider correctement, le buffer clavier, il faut faire :
int c;
while ( (c=getchar()) != '\n' && c != EOF );

(ou ton code avec ta variante fera l'affaire également).

Il faut vider le buffer lorsque c'est nécessaire. Donc, il faut l'enlever avant ton scanf().

Cdlt,
0