[C] Problème de boucle???

Maaag -  
mype Messages postés 2435 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'ai un petit soucis avec mon programme.
Voila j'ai un menu de choix dans mon programme avec une fonction différente pour chaque choix. Et le programme ré-affiche le menu de choix après l'avoir éxécuté.
Pour cela j'ai donc fait un do...while sur la réponse entrer (tant que l'utilisateur n'a pas choisit de quitter il réaffiche le menu)

Et le problème est le suivant, après avoir exécuté la fonction il me réaffiche bien mon menu mais en prenant déjà en compte une réponse, celle du défaut du switch (le mauvais choix) et me remet le menu après ou il me laisse le choix d'entrer quelque chose..
Je sais pas si j'ai été très clair...
Mais si vous avez des idées d'ou ca peut venir? De la boucle du menu? de la fonction?

Merci :(

15 réponses

SebManfred Messages postés 484 Date d'inscription   Statut Membre Dernière intervention   128
 
tu peux nous montrer ton switch et les retours de tes fonctions (types et valeurs)?
0
Maaag
 
pas de problème,
Voila le switch, dans le Do..While :

char reponse;

do {
printf("***************************************************\n");
printf("* Bienvenue dans le menu de gestion d'individus : *\n");
printf("***************************************************\n\n ");
printf(" N - Naissance\n D - Deces\n M - Mariage\n S - Separation\n A - Affichage\n Q - Quitter\n\n");
printf("Veuillez entrer votre choix : ");
reponse=getchar();
printf("\n\n");


switch (reponse) {
case 'A' :
affichage();
break;
default :
printf("Mauvais choix !!\n\n\n");
break;
}
}
while (reponse != 'Q');

Pour l'instant il n'y a que la fonction afficher, parce que j'avais déjà fait les autres mais comme je voyais pas d'ou venait le bug j'ai tout repris petit a petit, et ca bug déjà à la première fonction :(
Affichage et donc du type :

void affichage();
0
SebManfred Messages postés 484 Date d'inscription   Statut Membre Dernière intervention   128
 
ton switch prend des entiers en paramètres, pas des caractères...
si tu veux traiter des caractères, il faut que tu travailles avec des "if"
0
Maaag
 
Euh tu es sur de cela? parce que mon switch il fonctionne c'est juste qu'à la fin de lafonction il remet le menu "deux fois"..
De plus c'est notre prof qui nous a dit d'utiliser un case, et chez d'autres etudiants pas de problème.. donc je comprend pas trop :s
0

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

Posez votre question
Maaag
 
Je confirme, après vérification dans mon cours, le switch fonctionne sur des caractères, c'est sur les CHAINES de caractères que cela ne fonctionne pas....
0
SebManfred Messages postés 484 Date d'inscription   Statut Membre Dernière intervention   128
 
après ton getchar, fais un printf("%c",reponse);, pour voir ce qu'il y a dans ta réponse...
0
Maaag
 
Il y a bien le caractère que j'ai entrer...
0
Maaag
 
J'ai testé le case avec un printf tout simple a la place de la fonction, ca fait la meme chose...
Le problème vient donc forcément du do/while ou du switch mais je vois VRAIMENT pas ou ... :(

Si quelqu'un trouve merci :(
0
SebManfred Messages postés 484 Date d'inscription   Statut Membre Dernière intervention   128
 
tu entre bien des majuscules?
sinon, il faudrait que tu fasse
case 'A':
case 'a':
affichage();
break;
etc...
0
mype Messages postés 2435 Date d'inscription   Statut Membre Dernière intervention   437
 
le probleme c'est que apres avoir fait ton choix tu appuies sur entree donc le caractere '\n' est rentré dans la variable reponse donc ton switch prends le choix par default...

la solution tu rajoutes:
getchar();


apres
reponse=getchar();
0
Maaag
 
Oui j'entre bien des majuscules..
Et j'ai trouvé une solution : mettre fgetc(stdin) juste après mon getchar().. c'est pas optimal mais ca marche.
Merci pour ton aide en tout cas
0
mype Messages postés 2435 Date d'inscription   Statut Membre Dernière intervention   437
 
j'arrive trop tard ;)
0
SebManfred Messages postés 484 Date d'inscription   Statut Membre Dernière intervention   128
 
sinon, tu peux faire un scanf("%c",&reponse); à la place de ton getchar();
0
mype Messages postés 2435 Date d'inscription   Statut Membre Dernière intervention   437
 
ça va rien changer...il va toujours lui manquer un getchar() pour recuperer '\n'
0
Maaag
 
Bon en fait ma solution n'est qu'à moitié juste...
Parce que si je rentre un mauvaix choix il me le dit et me réaffiche un menu avec un mauvais choix déjà entrer et après un menu "vierge"

Par contre si je combine ta soluce mype avec la mienne ca marche a un détail près obligé d'appuyer sur entrer après avoir entrer le choix ...
0
mype Messages postés 2435 Date d'inscription   Statut Membre Dernière intervention   437
 
j'ai pas trop compris...
comme ça ça marche pas ?
char reponse;

do {
printf("***************************************************\n");
printf("* Bienvenue dans le menu de gestion d'individus : *\n");
printf("***************************************************\n\n ");
printf(" N - Naissance\n D - Deces\n M - Mariage\n S - Separation\n A - Affichage\n Q - Quitter\n\n");
printf("Veuillez entrer votre choix : ");
reponse=getchar();
getchar();
printf("\n\n");


switch (reponse) {
case 'A' :
affichage();
break;
default :
printf("Mauvais choix !!\n\n\n");
break;
}
}
while (reponse != 'Q');    return 0;}
0
Maaag
 
Non comme ca:

char reponse;

do {
printf("***************************************************\n");
printf("* Bienvenue dans le menu de gestion d'individus : *\n");
printf("***************************************************\n\n ");
printf(" N - Naissance\n D - Deces\n M - Mariage\n S - Separation\n A - Affichage\n Q - Quitter\n\n");
printf("Veuillez entrer votre choix : ");
reponse=getchar();
getchar();
fgetc(stdin);
printf("\n\n");


switch (reponse) {
case 'A' :
affichage();
break;
default :
printf("Mauvais choix !!\n\n\n");
break;
}
}
while (reponse != 'Q'); return 0;}


Avec le fgetc(stdin) en plus après getchar();... seul hic devoir appuyer sur entré après
0
mype Messages postés 2435 Date d'inscription   Statut Membre Dernière intervention   437
 
ben oui c'est normal il faut qu'un seul...
donc tu mets soit le fgetc(stdin) ou le getchar()
a toi de choisir ;)
0