#1 Le 23/10/2008, à 10: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, à 11: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, à 13:40
- djitar
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);
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, à 15:43
- nicolas.sitbon
Re : Problème de lecture avec la fonction scanf
http://xrenault.developpez.com/tutoriels/c/scanf/.
Cordialement.
Hors ligne