Comment effacer ce pointeur de tableau en C?

J’essaie de faire une bash basique avec l’utilisation d’appels système mais j’ai quelques problèmes avec un tableau de pointeurs.

Pour reprendre mon code, je lis les commandes du stdin avec read () dans un tampon, puis j’utilise strsep () pour séparer la commande des arguments et de tous les arguments dans un tableau. Ensuite, je crée un nouveau processus avec fork () et exécute cette commande avec les arguments associés avec execvp ().

Tout cela va dans une boucle infinie jusqu’à ce que l’utilisateur tape “quit” (pas encore codé). Le problème est qu’après la première itération, j’ai besoin que * pArgs soit vide, pour la prochaine commande et les arguments. Et je ne sais pas comment le faire …

Voici mon code:

#include  #include  #include  #include  int main(int argc, char **argv) { char bBuffer[BUFSIZ], *pArgs[10], *aPtr = NULL, *sPtr; int aCount; pid_t pid; while(1) { write(1, "\e[1;31mmyBash \e[1;32m# \e[0m", 27); read(0, bBuffer, BUFSIZ); sPtr = bBuffer; aCount = 0; do { aPtr = strsep(&sPtr, " "); pArgs[aCount++] = aPtr; } while(aPtr); pArgs[aCount-2][strlen(pArgs[aCount-2])-1] = '\0'; // Debug code to output pArgs content write(1, "|>", 2); write(1, pArgs[0], strlen(pArgs[0])); write(1, " 1) { pid = fork(); if(pid == -1) { perror("fork"); exit(1); } if(pid == 0) { execvp(pArgs[0], pArgs); exit(0); } } } return 0; } 

PS: Désolé, mais je ne peux pas fournir de scénario de test d’entrée et de sortie pour le moment. J’espère que ce n’est pas si difficile à comprendre et à résoudre que vous n’en avez pas besoin. Je le posterai plus tard s’il le faut …

Juste pour clarifier les choses:
Je sais que j’ai demandé comment effacer le tableau et j’ai eu une réponse à cela. Mais il me semble maintenant évident que mon problème n’était pas celui-là, mais les déchets que le tampon était en train de collecter, comme l’a souligné litb. Il est plus logique de terminer la chaîne avec le caractère nul que d’effacer le tableau. C’est pourquoi je marque la réponse de litb comme étant la bonne.

Votre problème est que vous n’ajoutez pas de caractère nul après la lecture des données. Donc, les appels strsep ne savent pas où s’arrêter. En C, les chaînes doivent être terminées par un caractère nul (appelé le caractère nul final).

 // don't forget to add error handling at some point (s == -1) ssize_t s = read(0, bBuffer, BUFSIZ-1); bBuffer[s] = '\0'; 

Avec cela en place, je ne vois pas quel tableau devrait être effacé maintenant, puisque execvp lira les arguments jusqu’au premier pointeur NULL. Cependant, la boucle do ajoute déjà ce pointeur null, qui est le pointeur null renvoyé par le dernier appel de strsep .

Bien entendu, le problème serait également résolu en effaçant simplement bBuffer (les données vers lesquelles *pArgs pointe après l’parsing de la première commande). Notez que vous devez le faire également avant la première parsing, car vous ne pouvez pas supposer que les caractères du tableau bBuffer sont initialisés à une valeur raisonnable.

 memset(bBuffer, 0, sizeof bBuffer); 

Placez-le juste avant l’appel de read (mais dans tous les cas, lisez uniquement au maximum BUFSIZE-1 , car le caractère nul BUFSIZE-1 doit également avoir de l’espace!).

Mais comme je l’ai montré ci-dessus, vous n’avez pas besoin de cet appel memset. Ajoutez simplement le caractère nul final manuellement.

 int i; for (i = 0; i < 10; i++) pArgs[i] = NULL;