2010-11-28 7 views
2

Je souhaite créer un menu simple dans un programme C acceptant un seul caractère. Le menu sera comme ceci:Menu acceptant un seul caractère en langage C

  1. [S] comment
  2. [E] xit

Si l'utilisateur d'entrer '1', 'l' ou 'S' le programme affichera " Bonjour "et demander à nouveau pour l'entrée sinon si l'utilisateur entre" 2 ", E ou" E "le programme se termine. sinon il devrait imprimer "entrée invalide" et demander à nouveau.

Je suis capable de créer le programme mais le problème est que lorsque l'utilisateur entre 12, 13, 14, 15, 16 ..... ainsi de suite en commençant par 1, il affiche Hello et même pour les autres options.

Mon code est:

#include <stdio.h> 

void clearBuffer(); 


int main() { 

    int i = 0; 
    char selection; 

    do 
    { 
     printf("\t1. [S]how\n"); 
     printf("\t2. [E]xit\n"); 
     printf("Enter your selection from the number or character noted above: "); 
     scanf("%s", &selection); 
     clearBuffer(); 

     if (selection == '1' || selection == 's' || selection == 'S') 
      printf("Hello"); 
     else if (selection == '2' || selection == 'E' || selection == 'x') 
      i = 0; 

} while(i != 0); 



} 

void clearBuffer() 
{ 

    while(getchar() != '\n'); 

} 
+0

Il arrive un moment où vous travaillez avec des interfaces utilisateur (même en mode caractère) lorsque vous avez probablement besoin de fonctions d'E/S qui ne sont pas dans la bibliothèque standard. S'il s'agit d'un exercice d'apprentissage, vous pouvez rechercher des fonctions spécifiques à une plate-forme ou une API portable prenant en charge des E/S plus immédiatement interactives. Dans la pratique, vous êtes probablement mieux avec une bibliothèque portative comme «malédictions» que l'IIRC va gérer vos menus pour vous - bien que je ne l'ai pas utilisé moi-même. J'ai déjà écrit une bibliothèque d'interface utilisateur en mode texte pour Turbo Pascal (beaucoup de gens l'ont fait - réinventer la roue était un passe-temps populaire), mais je ne le recommande pas. – Steve314

+0

'curses' serait en fait une excellente bibliothèque à utiliser pour un système de menu, mais cela prend un peu plus de temps que ce que l'OP fait ici. Si l'OP est à l'aise de travailler avec les bibliothèques et de faire tous les autres réglages/nettoyages impliqués dans les "malédictions", alors oui, allez-y. Cela ressemble plus à une tâche de devoirs, et je ne suis pas très sûr si il/elle est si loin dans la programmation. @ user521815: à quel point êtes-vous à l'aise avec la programmation C à ce stade? – Will

Répondre

2

Vous pouvez utiliser strlen, qui fait partie de la bibliothèque standard C, pour vérifier la longueur de la chaîne retournée par scanf et rejeter les entrées plus d'un caractère:

if (strlen(selection) > 1) 
{ 
    printf("Invalid selection."); 
} 

Alternativement, je pense que vous pourriez utiliser getchar() pour n'accepter qu'un seul caractère de l'utilisateur, ce qui signifie qu'il n'aurait pas besoin d'appuyer sur Entrée.

+0

Vous devez toujours appuyer sur entrer avec 'getchar()' –

+0

merci, cela a fonctionné –

3

Si vous allez recevoir un seul caractère envisager de remplacer la fonction pour getchar() fonction scanf():

printf("Enter your selection from the number or character noted above: "); 
selection = getchar(); 
1

Comme déjà mentionné, vous devez utiliser getchar() si vous voulez un seul caractère. Si vous voulez toujours utiliser scanf() pour une raison quelconque, le format correct est "%c", et non "%s".

Je suggère également que si vous cherchez un seul caractère, le bloc if semble un peu "occupé" (lire, maladroit) ... un commutateur serait un moyen plus propre et plus élégant de le faire (IMHO).

/* something like this ... */ 
switch (selection) { 
    case '1': 
    case 's': 
    case 'S': 
    printf ("Hello\n"); 
    break; 

    case '2': 
    case 'e': 
    case 'E': 
    i = 0; 
    break; 
} 

Autres deux choses ... si vous ne vous souciez pas le cas du caractère en cours de lecture (qui est, 's' et 'S' fera la même chose), vous pouvez convertir en majuscules selection avant if -bloc ou switch -bloquer en utilisant toupper(). En outre, et ceci est juste une suggestion de style, n'utilisez pas i pour votre drapeau de sortie. La pratique générale est d'utiliser des choses comme i et j pour les compteurs ou les index - vous pouvez utiliser quelque chose comme quit_now ou user_done qui permettrait de transmettre plus précisément ce que signifie la variable.

Questions connexes