2010-11-18 60 views
0

Ce que je vais faire est de créer un menu terminal qui prend différents types d'arguments et le place dans un tableau param. Sous est le code: Voici quelques problèmes que j'ai et je ne peux pas trouver une bonne solution pour.Création d'un menu de terminal avec un défi

si je tape simplement 'list' je vais obtenir Pas une commande valide, je dois taper "list" (liste et espace). Le choix du menu devrait être comme ceci: nouveau "Mon nom est bonjour". param [0] = new et param [1] = Mon nom est bonjour, (sow je peux créer un message avec des espaces).

Comment puis-je accomplir ceci?

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

int menu() 
{ 
    printf(">"); 

    char line[LINE_MAX]; 
    int i = 0; 
    char *param[4]; 

    while(fgets(line, LINE_MAX, stdin) != NULL) { 
     param[i++] = strtok(line, " \n"); 

     if(param[0] != NULL) { 
      char *argument; 

      while((argument = strtok(NULL, "\n")) != NULL) { 
       param[i++] = argument; 
      } 
     } 

     if(strcmp(param[0], "new") == 0) { 
      //new(param[1]); 
      menu(); 

     } else if(strcmp(param[0], "list") == 0) { 
      //list(); 
      menu(); 

     } else { 
      printf("Not a valid command.\n\n"); 
      menu(); 
     } 
    } 

    return 0; 
} 

Répondre

0

Je ne sais pas si cela cause votre problème, mais ces lignes

 /*new(param[1]); 

     /*list(); 

Démarrer un commentaire qui n'a jamais été mis fin.

Si vous voulez une ligne commentaires que vous pouvez utiliser:

 // comment 

(atleast en C++ et de C99 sur)

Mais les commentaires commençant par /* doit se terminer par un */ et non imbriqués:

/* comment */ 

/* also multi line 
    allowed */ 

Puisque vous commencez un commentaire dans un commentaire, votre compilateur aurait dû émettre un avertissement, en fait cela ne devrait pas du tout se compiler .

+0

Hmm maintenant il a été édité loin ...mais si c'est en quelque sorte lié à la cause du problème ?? –

+0

Salut .. SOry, ma faute, est en ce moment. J'ai commenté ces fonctions, vous pouvez compiler le code. – user265767

+0

désolé de la modification. Le programme ci-dessus souffre de nombreux problèmes (y compris la logique du programme) et la modification de ces commentaires est nécessaire. Mais pas de relation à la question: la question posée sur les choses hapenning avant les lignes avec les commentaires. – pmg

1

Vous êtes en train de délimiter "".

fgets lit l'entrée. Donc, quand vous tapez "listENTER" et tokenise aux espaces vous obtenez un jeton, à savoir "listENTER". Plus tard, vous comparez avec "liste" et, bien sûr, il ne correspond pas.

Essayez

strtok(line, " \n"); /* maybe include tabs too? */ 

PS. Pourquoi appelez-vous récursivement menu? Vous avez déjà un while dans la fonction ...

+0

merci. Cela permettra de résoudre l'un des problèmes! Comment puis-je obtenir le menu pour mettre tout entre "ceci, même s'il y a de l'espace" dans param []? – user265767

+0

Peut-être poser une nouvelle question ... vous devez revoir 'param'. Il a de l'espace pour 4 pointeurs; votre chaîne a beaucoup plus de 4 jetons. – pmg

+0

Vous avez mal compris. donné la commande suivante: new "mon nom est", param [0] = new, param [1] = mon nom est. – user265767

1

Votre problème est param [i ++] = strtok (ligne, ""); ne se divise que sur l'espace, pas sur \ n (nouvelle ligne). Essayez d'ajouter ceci à votre tableau de délimiteurs.

Oh, et félicitations pour un code décent qui est propre et bien formaté. Un changement agréable.

0

La raison pour laquelle vous devez taper "list" est que votre premier strtok marque un caractère espace, vous devez donc en entrer un dans ce cas. Essayez d'autoriser à la fois '\n' et l'espace en tant que séparateurs, c'est-à-dire de remplacer le deuxième paramètre de strtok par " \n". Comme pour les guillemets, vous devez combiner les paramètres commençant par celui commençant par un guillemet à celui qui se termine par un en remplaçant les espaces entre eux par des espaces. Ou faire disparaître strtok et analyser en itérant manuellement à travers les caractères dans line.