C ; menu switch case probleme

capa57 Messages postés 383 Statut Membre -  
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   -
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 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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 383 Statut Membre 13
 
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 4122 Date d'inscription   Statut Membre Dernière intervention   663
 
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 383 Statut Membre 13
 
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 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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