Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 23/10/2008, à 11:52

djitar

Problème de lecture avec la fonction scanf

Salut,

   Je rencontre un soucis de lecture avec la fonction scanf. Voici le bout de code (écrit en C) :
   
   printf ("Nombre : ");
   scanf ("%d", &x);  //x de type int

   printf ("Caractère : ");
   scanf ("%c", &y);  //y de type char

   printf ("Réel : ");
   scanf ("%f", &z);  //z de type float

   Bien entendu, ce code est assez banal ! Le problème est le suivant : sous windows, à l'exécution la lecture de y ne s'effectue pas (du moins le programme effectue un saut directement pour lire la valeur de z). Explication (vous me corrigerez en cas d'erreur) : le programme reconnaît la touche entrée (enfoncée pour valider la 1ère saisie) comme un caractère de retour à la ligne et l'affecte à y. S'en suit alors la lecture directe de z !

   Solution : sous windows, il fallait ajouter fflush(stdin) après chaque appel à scanf pour vider la mémoire tampon et ainsi aucun saut ne se produit :

   printf ("Nombre : ");
   scanf ("%d", &x);  //x de type int
   [b]fflush(stdin)

   
   printf ("Caractère : ");
   scanf ("%c", &y);  //y de type char
   fflush(stdin)

   printf ("Réel : ");
   scanf ("%f", &z);  //z de type float
[/b]

   Et la ça passe ! Par contre (et c'est là où se situe réellement le problème), sous Linux ce rajout n'a aucun effet et le saut persiste !

   Questions : A quoi est-ce dû ? Et Quelle(s) autre(s) solution(s) pour y remédier (sous linux bien entendu) ?

Merci d'avance.

Hors ligne

#2 Le 23/10/2008, à 12:59

nicolas.sitbon

Re : Problème de lecture avec la fonction scanf

fflush(stdin) invoque un comportement indéterminé selon la norme. C'est donc bien ton code le fautif.
Pour vider le buffer clavier, 2 méthodes:

int c;
while ((c = getchar ()) != '\n'  &&  c != EOF)
   continue;

ou bien

scanf ("%*[^\n]"), getchar ();

j'ajouterai que la forme canonique de la fonction scanf() est :

int x;
int ret = 0;

do
{
   puts ("Nombre : ");
   ret = scanf ("%d", &x);
   scanf ("%*[^\n]"), getchar ();
}
while (ret != 1);

Hors ligne

#3 Le 23/10/2008, à 14:40

djitar

Re : Problème de lecture avec la fonction scanf

nicolas.sitbon a écrit :

fflush(stdin) invoque un comportement indéterminé selon la norme. C'est donc bien ton code le fautif.
Pour vider le buffer clavier, 2 méthodes:

int c;
while ((c = getchar ()) != '\n'  &&  c != EOF)
   continue;

ou bien

scanf ("%*[^\n]"), getchar ();

j'ajouterai que la forme canonique de la fonction scanf() est :

int x;
int ret = 0;

do
{
   puts ("Nombre : ");
   ret = scanf ("%d", &x);
   scanf ("%*[^\n]"), getchar ();
}
while (ret != 1);

Salut,

  Merci pour ta réponse. Cependant, pour la seconde méthode je ne saisie pas trop ce que t'as mis en paramètre de la fonction scanf : "%*[^\n]". Peux tu m'éclairer ? (un lien serait le bien venu !)

Hors ligne

#4 Le 23/10/2008, à 16:43

nicolas.sitbon

Re : Problème de lecture avec la fonction scanf

Hors ligne