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

Résolu
cs_Darkroro Messages postés 2 Date d'inscription jeudi 17 novembre 2005 Statut Membre Dernière intervention 18 novembre 2005 - 17 nov. 2005 à 18:21
cs_ibn adam Messages postés 1 Date d'inscription mercredi 16 novembre 2005 Statut Membre Dernière intervention 18 novembre 2005 - 18 nov. 2005 à 22:17
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 ?
A voir également:

5 réponses

Lord_Patoche Messages postés 196 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 1 mai 2009 3
17 nov. 2005 à 23:24
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
3
hbpo Messages postés 3 Date d'inscription vendredi 18 juin 2004 Statut Membre Dernière intervention 17 novembre 2005
17 nov. 2005 à 18:50
Salut,

ca bug parce que tu mets un \n dans ton scanf.
si tu l'enlèves, ca marchera.
0
cs_Darkroro Messages postés 2 Date d'inscription jeudi 17 novembre 2005 Statut Membre Dernière intervention 18 novembre 2005
18 nov. 2005 à 04:00
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 !
0
Lord_Patoche Messages postés 196 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 1 mai 2009 3
18 nov. 2005 à 19:27
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ibn adam Messages postés 1 Date d'inscription mercredi 16 novembre 2005 Statut Membre Dernière intervention 18 novembre 2005
18 nov. 2005 à 22:17
utilise la fonction flushall : vide tous les tampon associes a un flux d entre

0
Rejoignez-nous