2017-03-05 7 views
0

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.

+1

* "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

+5

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. –

+3

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. –

Répondre

1

Selon la norme C (7.22.4.6 La fonction getenv)

  1. ... La chaîne pointée ne doit pas être modi fi é par le programme

Et la fonction standard C strtok change la chaîne d'origine passée à la fonction comme argument.

Vous pouvez utiliser à la place la fonction standard C strchr pour trouver le caractère ':' puis copiez la chaîne trouvée dans un tableau de caractères en utilisant une autre fonction standard memcpy puis ajoutez avec les chaînes nécessaires.