Fichier d'en-tête:
maiah@maiah-vb:~/shared$ ./a.out MENU 1. Total of All Top Scores for the Week 2. Total of All High Scores for the Week 3. Total Machine High Scores for the Week 4. Machine High Score for the Week 5. EXIT Enter Selection:d Invalid Selection MENU 1. Total of All Top Scores for the Week 2. Total of All High Scores for the Week 3. Total Machine High Scores for the Week 4. Machine High Score for the Week 5. EXIT Enter Selection: Invalid Selection MENU 1. Total of All Top Scores for the Week 2. Total of All High Scores for the Week 3. Total Machine High Scores for the Week 4. Machine High Score for the Week 5. EXIT Enter Selection:
Fichier C principal:
#include <stdio.h> #include <stdlib.h> #include "lab1.h" int main(int argc, char *argv[]){ int selection = print_menu(); while(1) { switch (selection) { case '1': printf ("\nselected 1\n"); break; case '2': printf ("\nselected 2\n"); break; case '3': printf ("\nselected 3\n"); break; case '4': printf ("\nselected 4\n"); break; case '5': printf ("\nExit\n"); exit(0); break; default: printf ("Invalid Selection"); print_menu(); break; }; }; }
Mon problème est que lorsque j'exécute le programme et que j'entre une erreur caractère que le programme est supposé réimprimer le menu et demander à nouveau la sélection. Sauf qu'il imprime le menu deux fois. Exemple:
#include <stdio.h> #include <stdlib.h> int print_menu(){ printf ("MENU\n"); printf ("1. Total of All Top Scores for the Week\n"); printf ("2. Total of All High Scores for the Week\n"); printf ("3. Total Machine High Scores for the Week\n"); printf ("4. Machine High Score for the Week\n"); printf ("5. EXIT\n"); printf ("Enter Selection:"); int selection = getchar(); return selection; }
Ensuite, vous avez la possibilité d'entrer dans une autre sélection. Quand je suis passé, j'ai remarqué qu'il semble prendre la sélection de `` d '' et sortir correctement, mais agissant ensuite comme un espace vide ou une nouvelle ligne a été automatiquement entré et vérifie la sélection (je ne suis pas sûr que ce soit le problème réel cependant - c'est juste comment il semble agir). Si quelqu'un a des idées sur la façon de résoudre ce problème et expliquez pourquoi cela se produit. Toute aide serait formidable!
3 Réponses :
Vous devez conserver ce que votre fonction d'impression renvoie.
default: printf ("Invalid Selection"); break; }; selection = print_menu(); }; /* end of while */
Le deuxième problème est que votre appel getchar () prendra également le retour après votre sélection. Ajoutez un autre getchar ()
pour le consommer.
int selection = getchar(); (void) getchar(); /* ignore enter key */ return selection;
En passant, ne mettez pas de code dans les en-têtes, uniquement les déclarations.
Sinon, le code sera compilé dans chaque fichier de code (parmi plusieurs) qui comprend l'en-tête et vous obtiendra plusieurs erreurs de définition. Ce n'est pas apparent si vous n'avez qu'un seul fichier de code avec l'en-tête, mais vous devriez prendre la bonne habitude tôt.
Enfin, vous devez toujours relire, pas seulement dans le cas de 5. p>
default: printf ("Invalid Selection"); selection = print_menu(); break;
Ie faites-le dans la boucle mais en dehors des instructions case, car la branche par défaut n'est prise que si aucune des autres n'a été exécutée.
Je suggérerais d'utiliser scanf ("% c", & selection);
au lieu de getchar
@ vx3r OK, répondez pour expliquer les avantages.
@Yunnosch merci beaucoup pour vos explications! Je suis passé et j'ai apporté les changements. Cela fonctionne maintenant comme j'en ai besoin et j'ai déplacé ma fonction d'impression dans le fichier c!
Essayer
while(1) { int selection = print_menu(); switch (selection) .... }
Cela aide à résoudre la plupart des problèmes. Mais s'il vous plaît écrivez une explication de votre code pour aider à lutter contre l'idée fausse selon laquelle StackOverflow est un service d'écriture de code gratuit, qui est autrement réparti par code uniquement. De plus, "Essayer ..." donne l'impression de "Je ne sais pas si cela aide.". Je recommande d'essayer des réponses plus affirmées.
getchar ()
a pour effet secondaire de supprimer le caractère suivant du tampon d'entrée.
Puisque le scanf ()
est invité à lire un et un seul caractère (% c)
, cela a pour effet d'ignorer tout le reste sur cette ligne d'entrée. p>
Effacez également la console avant de réimprimer le menu.
#include <stdio.h> #include <stdlib.h> #include <stdio.h> int print_menu() { char selection; printf("MENU\n"); printf("1. Total of All Top Scores for the Week\n"); printf("2. Total of All High Scores for the Week\n"); printf("3. Total Machine High Scores for the Week\n"); printf("4. Machine High Score for the Week\n"); printf("5. EXIT\n"); printf("Enter Selection:"); scanf("%c", &selection); return selection; } int main(int argc, char *argv[]) { int selection; while(1) { selection = print_menu(); switch (selection) { case '1': printf("\nselected 1\n"); exit(selection); break; case '2': printf("\nselected 2\n"); exit(selection); break; case '3': printf("\nselected 3\n"); exit(selection); break; case '4': printf("\nselected 4\n"); exit(selection); break; case '5': printf ("\nExit\n"); exit(0); break; default: system("@cls||clear"); printf("\nInvalid Selection\n"); break; }; }; }
"getchar () a pour effet secondaire de supprimer le caractère suivant du tampon d'entrée" Oui, même chose pour scanf. "scanf () est invité à lire un et un seul caractère (% c) ceci a pour effet d'ignorer tout le reste sur cette ligne d'entrée" oui, getchar ignore également tout ce qui dépasse la lettre unique.
Avez-vous testé ce programme? J'ai fait. Il ne boucle jamais, quoi que vous entriez. Si vous supprimez plusieurs exit (sélection)
, cela fait une boucle mais affiche toujours (sauf 5) "Sélection invalide". (Je suppose qu'avec un bref éclair de la sortie souhaitée pour la toute première sélection, <5 est entré.) La cause principale peut être trouvée dans sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html
Si vous supprimez en plus l'appel system ()
, vous pouvez voir la sortie souhaitée par exemple. 1, suivi immédiatement par le menu et "Sélection invalide". Voir l'article que j'ai lié pour l'explication, en bref, scanf ()
ignore le reste de la ligne, comme vous l'avez correctement dit, il ne la consomme cependant pas non plus - exactement comme getch ().
Ne mettez pas de code dans les en-têtes.