Bonjour,
Je souhaite avant même de répondre à votre question, vous faire quelques retours sur le code actuel.
Premier conseil, toujours initialisé les variables à leurs déclarations :
1 2 3 4 5
| int i;
char *ligne;
char *tokens[100];
char *cmd;
char *commande = "mkdir brol"; |
deviendra :
1 2 3 4 5
| int i = 0;
char *ligne = NULL;
char *tokens[100] = {0};
char *cmd = NULL;
char *commande = "mkdir brol"; |
Ensuite, pour chaque allocation de mémoire (malloc), il vous faut un free correspondant (sinon, c'est une fuite de mémoire) :
Pour
ligne=(char*)malloc(300);
faire un
avant la fin du programme.
Ce test while (strcmp(ligne,"exit\n")) ne fonctionnera pas si j'entre "exit " (avec un espace à la fin). Il faudrait trouver une astuce pour enlever les surplus d'espace.
Maintenant, à propos de la gestion de la commande, l'idée est de comprendre comment on doit la gérer. En effet, même si l'espace est un délimiteur, cela ne suffit pas toujours.
Pour votre commande exemple
mkdir brol && (cd brol;>f)
elle doit être délimiter par '&&' (et exécuter la suite que si la première commande à réussie), puis par le ";". Les espaces ne doivent pas vraiment être pris en compte.
Je vous conseille, au lieu d'utiliser strtok, d'utiliser une fonction bien à vous, qui sera spécialisé dans la décomposition de la commande et qui pourra aussi vous dire si le résultat d'une commande doit être vérifié. Pour ce genre de fonction, je verrai une signature du genre :
int splitCommand(const char* input, char*** out, size_t* nbCommand);
Le type de retour peut être remplacé par un enum. input est l'entrée et out un tableau de chaine de caractère qui sera alloué dans la fonction (un peu dangereux certes), ce qui explique que j'ai trois niveaux de pointeurs. nbCommand contiendra le nombre de commande décomposées (un pointeur car c'est la fonction qui détermine la valeur).
Il est évidant qu'il faudra bien faire attention aux pointeurs et allocations de mémoire.
(Peut être qu'il y a plus simple, mais dans l'immédiat, je ne vois pas
)
Partager