Bug de scanf, comment résoudre mon problème ? (en C)

[Résolu]
Signaler
Messages postés
2
Date d'inscription
jeudi 17 novembre 2005
Statut
Membre
Dernière intervention
18 novembre 2005
-
Messages postés
1
Date d'inscription
mercredi 16 novembre 2005
Statut
Membre
Dernière intervention
18 novembre 2005
-
Je m'explique :

j'ai un programme qui à un moment demande de saisir un char, pour ce faire, j'ai une fonction :

void saisir_char()
{
printf("Saisir un caractère : ");
scanf("%c\n", caract);
}

dans mon programme je fais suivre l'appel de cette fonction par une instruction de test :

printf("Caract = %c\n", caract);

Le problème est qu'il ne prend en compte ma saisi qu'une fois sur deux !
Exemple :
...Début du programme
...
Saisir un caractère : a ==> là j'ai donc saisi a et fait entrerCaract > là ça devrait afficher "Caract = a"
...

Si je fais plusieurs fois de suite la saisi du caractère, on s'aperçoit que la saisie est "décalée" !
Exemple :
...Début du programme
...
Saisir un caractère : a ==> je tappe a et fait entrerCaract > devrait afficher "Caract = a"
...
Saisir un caractère : b ==> je tappe b et fait entrerCaract a > devrait afficher "Caract = b"
...
Saisir un caractère : c ==> je tappe c et fait entrer
Caract = b . . . et ainsi de suite

J'ai essayer de régler le problème en utilisant getchar au lieu de scanf mais dans ce cas, il saute carrement la saisie.

Quelqu'un peut m'aider svp ?

5 réponses

Messages postés
196
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
1 mai 2009
2
salut.
1) déclares caract
2) scanf("%c", &caract); // Utilise l'adresse de caract
3) lorsque tu effectues un scanf cela constitue une entrée clavier. il arrives qu'il faille vider la mémoire tampon aant de faire un nouvel appel à l'entrée clavier. Ainsi, si tu t'aperçois que ton programme ne prend pas en compte ton deuxièe scanf, intègre un appel getchar( ) avant.

LaPatoshe
Messages postés
3
Date d'inscription
vendredi 18 juin 2004
Statut
Membre
Dernière intervention
17 novembre 2005

Salut,

ca bug parce que tu mets un \n dans ton scanf.
si tu l'enlèves, ca marchera.
Messages postés
2
Date d'inscription
jeudi 17 novembre 2005
Statut
Membre
Dernière intervention
18 novembre 2005

Juste une petite question : comment se fait-il que je doive vider le buffer ? Si je ne me trompe pas je ne met rien dedans . . . pourtant je confirme ce que tu dis, si je ne mets pas de getchar il me saute caremment la première saisie puis une saisi après chaque saisie réussi !
C'est vraiment bizarre . . . m'enfin en tout cas ça marche maintenant !
Merci Beaucoup !
Messages postés
196
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
1 mai 2009
2
Un programmeur je pense pourrais te donner la réponse exacte de ce phénomène. De ce que j'en sais, cela s'apparente à la forme brute de la fonction scanf. Lorsqu'on entre quelque chose au clavier, cela rempli une mémoire tampon (indépendente de ta variable.) Ensuite, ce tampon se vide et son contenu va où tu le demande (écran, imprimante, variable...) Cependant, d'après ce que j'ai compris, la mémoire tampon ne se vide jamais entièrement et pour se faire, il faut envoyer une procédure spécifique. Il me semble que sous C++, il existe des procédures explicites tel que flush() ou quelque chose comme ça. Je l'ai déjà essayé mais sans succès, alors j'utilise getchar() qui n'est pas prévu pour cela à l'origine, mais c'étais ce que j'avais lu dans un bouquin de C, et la ça marche.

LaPatoshe
Messages postés
1
Date d'inscription
mercredi 16 novembre 2005
Statut
Membre
Dernière intervention
18 novembre 2005

utilise la fonction flushall : vide tous les tampon associes a un flux d entre