Je crée mon propre shell en utilisant c, mais je continue d'obtenir une erreur, qui consiste, je crois, à utiliser strtok
et strcat
. Notez que path
et userInput
sont des chaînes globales.c, en utilisant strtok et strcat ensemble
int myFunction()
{
char *possiblePaths = getenv(PATH);
path = strtok(possiblePaths,":");
path = strcat(path,"/");
path = strcat(path, userInput);
while(path != NULL)
{
//other code
path = strtok(NULL,":");
path = strcat(path,"/");
path = strcat(path, userInput);
}
return 1;
}
getenv me donne une chaîne,
/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/texbin
Ce que je veux faire est alors tokenize la chaîne basée sur ':'
, puis concaténer '/'
plus la variable globale ma userInput
. La sortie devrait ressembler,
/opt/local/bin/userInput
Alors la prochaine fois que la boucle je recevrais
/opt/local/sbin/userInput
Malheureusement, je reçois le texte suivant
/opt/local/bin/userInput
userInput/userInput
/userInput/userInput
/userInput/userInput
Mon premier me donner strtok
et strcat
la résultat correct. Mais alors /userInput
continuera de boucler jusqu'à ce que j'atteigne un défaut de segmentation. Je suis assez sûr que mon erreur a à voir avec le mélange de pointeurs en utilisant strtok
et strcat
mais je n'arrive pas à comprendre comment le réparer.
* "Notez que path et userInput sont des chaînes globales" * - Ne nous demandez pas de noter quoi que ce soit. Mettez leurs définitions explicitement dans votre [mcve]. – StoryTeller
Vous ne devez pas pirater la chaîne renvoyée par 'getenv()' - vous modifiez l'environnement PATH de votre shell. Cela peut ne pas importer si vous êtes prudent (mais c'est probablement le cas - vous devrez utiliser 'execve()' ou similaire, et définir explicitement une valeur PATH sécurisée), mais vous aurez probablement besoin de prendre une copie et travailler avec ça. –
De même, lorsque vous utilisez 'strcat()', vous écrasez le segment suivant du PATH avec ce que vous concaténez. Vous devez repenser ce que vous faites - travaillez là où vos opérations de cordes lisent et écrivent. En ce moment, vous avez un bordel. –