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
Bonjour,

J'ai un petit probleme avec mon code, il fonctionne mais il y a un petit soucis au niveau de ma répétition, il m'affiche 2 fois le menu...
voici mon code : je pense que c'est à cause de mon DO while qui est mal positionner mais je vois pas comment faire je bloque là ^^

pour infos je bosse sous ubuntu parce qu'il y a des commandes linux dans mon code.

#include <stdio.h>
#include <stdlib.h>

int main()
{
char choose,A,B,C,D;
int n=0;

do
{
printf("=== Menu ===\n\n");
printf("A. list files / subdirectories in the current directory\n");
printf("B. show current date time\n");
printf("C. show the path to the current directory\n");
printf("D. exit\n");
printf("\nVotre choix ? ");
scanf("%c", &choose);

printf("\n");



switch (choose)
{
case 'A':
system("/bin/sh -c ls");
break;
case 'B':
system("/bin/sh -c date");
break;
case 'C':
system("/bin/sh -c pwd");
break;
case 'D':
//system("/usr/bin/killall killall exo1.exe");
return 1;
break;
default:
printf("Enter A or B or C or D, nothing else !!! (not a b c d)");
break;

}

printf("\n\n");

//fin do
}
while(choose != 'D');
//fin main
}







*******************
et il m'affiche çà, le menu apparait je rentre ma valeur A, il me sort ce que j'ai besoin, et me répète 2 fois le menu après.... je comprends pas là NEED HELP :p


=== Menu ===

A. list files / subdirectories in the current directory
B. show current date time
C. show the path to the current directory
D. exit

Votre choix ? A

exercice1.c exo1.exe


=== Menu ===

A. list files / subdirectories in the current directory
B. show current date time
C. show the path to the current directory
D. exit

Votre choix ?
Enter A or B or C or D, nothing else !!! (not a b c d)

=== Menu ===

A. list files / subdirectories in the current directory
B. show current date time
C. show the path to the current directory
D. exit

Votre choix ?

A voir également:

3 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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,
0
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
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 ?
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
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')
0
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
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...
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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",).
0