C ; menu switch case probleme
Fermé
capa57
Messages postés
352
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
26 mai 2016
-
Modifié par capa57 le 18/11/2011 à 15:52
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 20 nov. 2011 à 21:00
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 20 nov. 2011 à 21:00
A voir également:
- C ; menu switch case probleme
- Menu déroulant excel - Guide
- Windows 11 menu démarrer classique - Guide
- Logiciel switch - Télécharger - Conversion & Extraction
- Aller à la ligne dans une case excel - Guide
- Canon quick menu - Télécharger - Utilitaires
3 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
18 nov. 2011 à 16:17
18 nov. 2011 à 16:17
Bonjour,
J'ai pas tout lu mais je me suis arrêté à la première erreur pouvant provoquer ton erreur.
scanf("%c", &choose);
Cela provoquera le stockage d'un '\n' dans le buffer clavier, caractère qui sera stocké dans "choose" lors de la prochaine itération.
Pour corriger, il te suffit de mettre un getchar(); après le scanf("%c",&choose);
Cdlt,
J'ai pas tout lu mais je me suis arrêté à la première erreur pouvant provoquer ton erreur.
scanf("%c", &choose);
Cela provoquera le stockage d'un '\n' dans le buffer clavier, caractère qui sera stocké dans "choose" lors de la prochaine itération.
Pour corriger, il te suffit de mettre un getchar(); après le scanf("%c",&choose);
Cdlt,
capa57
Messages postés
352
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
26 mai 2016
13
18 nov. 2011 à 16:21
18 nov. 2011 à 16:21
bha en fait mon code fonctionne....
mais dès que je rajoute mon do et mon while, ben là ça bug. Sinon sans do et while ça fonctionne niquel
getchar() c'est pas pour récupérer les valeurs ascii ?
mais dès que je rajoute mon do et mon while, ben là ça bug. Sinon sans do et while ça fonctionne niquel
getchar() c'est pas pour récupérer les valeurs ascii ?
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
663
18 nov. 2011 à 16:44
18 nov. 2011 à 16:44
oui, ce que fait exactement scanf("%c") aussi... (un caractère == un code numérique en c)
la lecture du clavier se fait par buffer
le scanf ("%c") va lire UN caractère dans le tampon(buffer) clavier.
Or, puisque tu as tapé " A " et ENTREE, il y a 2 caractères dans le buffer : le caractère 'A' et le caractère '\n'
le scanf va donc mettre le premier dans la variable choix, et ensuite faire ce qu'il faut comme il faut.
puis, il y a un deuxième affichage du menu, puis le deuxième scanf, à cause de ta boucle.
ce deuxième scanf ne va pas attendre qu'on écrive qqchose au clavier, car il y a encore quelque chose dedans : le caractère '\n'. Donc au deuxième passage, scanf met directement '\n' dans la variable choix. Comme ce n'est pas une valeur pour laquelle tu as prévu qqchose, il ne se passe rien et la boucle repart, affichant une troisième fois le menu directement après le deuxième affichage.
Il faut donc vider ton buffer clavier après avoir lu le caractère. Un autre scanf(%c) peut faire l'affiare, ou un getchar.
en fait je pense plutot que le mieux serait de lire tes caractères non pas avec scanf mais avec getchar justement, ça éviterai de devoir taper ENTREE, et empecherai aussi des entrées "longues"
par exemple : si dans ton code tu tapes ABC tu vas voir que les trois choix vont etre fait (premiere lecture, un A, deuxième lecture, un B, troisième lecture un C, quatrième lecture le caractère ENTREE '\n')
la lecture du clavier se fait par buffer
le scanf ("%c") va lire UN caractère dans le tampon(buffer) clavier.
Or, puisque tu as tapé " A " et ENTREE, il y a 2 caractères dans le buffer : le caractère 'A' et le caractère '\n'
le scanf va donc mettre le premier dans la variable choix, et ensuite faire ce qu'il faut comme il faut.
puis, il y a un deuxième affichage du menu, puis le deuxième scanf, à cause de ta boucle.
ce deuxième scanf ne va pas attendre qu'on écrive qqchose au clavier, car il y a encore quelque chose dedans : le caractère '\n'. Donc au deuxième passage, scanf met directement '\n' dans la variable choix. Comme ce n'est pas une valeur pour laquelle tu as prévu qqchose, il ne se passe rien et la boucle repart, affichant une troisième fois le menu directement après le deuxième affichage.
Il faut donc vider ton buffer clavier après avoir lu le caractère. Un autre scanf(%c) peut faire l'affiare, ou un getchar.
en fait je pense plutot que le mieux serait de lire tes caractères non pas avec scanf mais avec getchar justement, ça éviterai de devoir taper ENTREE, et empecherai aussi des entrées "longues"
par exemple : si dans ton code tu tapes ABC tu vas voir que les trois choix vont etre fait (premiere lecture, un A, deuxième lecture, un B, troisième lecture un C, quatrième lecture le caractère ENTREE '\n')
capa57
Messages postés
352
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
26 mai 2016
13
20 nov. 2011 à 20:48
20 nov. 2011 à 20:48
je comprends pas... j'ai compris qu'il prenait 2 caractères. (A) et (\n) automatiquement , mais comment lui dire qu'il prenne juste mon 1er caractère ?
mettre un 2ème scanf ?? ou donc ?
je cherche mais je vois pas...
mettre un 2ème scanf ?? ou donc ?
je cherche mais je vois pas...
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
20 nov. 2011 à 21:00
20 nov. 2011 à 21:00
Lorsque tu tapes "A" au clavier et que tu appuies sur la touche entrée, il va y avoir deux caractères qui sont pris en compte : 'A' et '\n'.
Lors du premier scanf("%c",), tu vas récupérer 'A' (puisque tu ne lis qu'un caractère). Lorsque tu vas retomber sur un scanf("%c",) il lira le prochain caractère dans le buffer ('\n').
Il faut donc refaire un second scanf ou plus élégant : getchar(); après le scanf("%c",).
Lors du premier scanf("%c",), tu vas récupérer 'A' (puisque tu ne lis qu'un caractère). Lorsque tu vas retomber sur un scanf("%c",) il lira le prochain caractère dans le buffer ('\n').
Il faut donc refaire un second scanf ou plus élégant : getchar(); après le scanf("%c",).