2017-10-05 3 views
2

Je travaille sur un projet qui implique l'utilisation de strtok et, pour une raison quelconque, j'obtiens des valeurs NULL au lieu des valeurs réelles (qui devraient être "Deux" et "Trois"). Voici mon code:Obtention de valeurs NULL lors de l'utilisation de strtok [C]

int main(){ 
    int h,z; 

    char text[100] = "One Two Three"; 

    for(h = 0; h < 4; h ++){ 

     char *first = strtok(text, " "); 
     printf("%s\n",first); 

     for(z = 0; z < 3; z++){ 
      char *second = strtok(NULL, " "); 
      printf("%s\n",second); 


     } 
    } 
    return 0; 
} 

La sortie Je reçois est:

One 
Two 
Three 
One 
(null) 
(null) 
One 
(null) 
(null) 
One 
(null) 
(null) 

Que puis-je faire pour obtenir la bonne valeur Two et Three au lieu de null?

+1

'z < 3' ->' z <2' ? –

+0

@StephanLechner Je l'ai fait mais j'ai toujours la même sortie - null – Lucas

+4

'strtok()' * modifie la chaîne * en y insérant des terminaisons de chaîne à la place des délimiteurs qu'il découvre. Ainsi, si vous voulez vraiment marquer la même entrée plusieurs fois, comme vous essayez de le faire en exécutant la boucle entière dans votre boucle sur 'h', vous devez éviter de mettre la chaîne originale en jeu. Faites des copies et marquez-les. –

Répondre

1

Notez que votre code réinitialise réellement la chaîne text 4 fois, car vous avez des boucles imbriquées. Notez également que z < 3 est un arrêt et devrait être z < 2:

int main(){ 
    int h,z; 

    char text[100] = "One Two Three"; 

    for(h = 0; h < 4; h ++){ 

     char *first = strtok(text, " "); 
     printf("%s\n",first); 

     for(z = 0; z < 2; z++){ 
      char *second = strtok(NULL, " "); 
      printf("%s\n",second); 


     } 
    } 
    return 0; 
} 

Mais strtok introduit '\0' chaque fois qu'un -Les personnages jeton se trouve. Par conséquent, après la première exécution du for(h...) -loop, text sera "One" et pour les boucles suivantes, un seul jeton peut être trouvé; les jetons # 2 et # 3 n'existent pas dans "One".

Pour re-tokenize (quelle qu'en soit la raison), vous devrez re-initialiser text:

int main(){ 
    int h,z; 

    char text[100]; 

    for(h = 0; h < 4; h ++){ 

     strcpy(text,"One Two Three"); 

     char *first = strtok(text, " "); 
     printf("%s\n",first); 

     for(z = 0; z < 2; z++){ 
      char *second = strtok(NULL, " "); 
      printf("%s\n",second); 
     } 
    } 
    return 0; 
} 
+0

cela a du sens. Y a-t-il un moyen de contourner ce problème - en évitant d'ajouter '\ 0'? – Lucas

+2

@Lucas: pas avec 'strtok'; Cette fonction introduit toujours un «\ 0» quand un jeton est trouvé. Copiez donc la valeur originale dans 'text' encore et encore, ou choisissez un autre algorithme (basé par exemple sur' strchr' et 'strncpy'), ou' sscanf', ... –

1

Vous pouvez tokenizer la chaîne, l'enregistrer dans un double pointeur et l'imprimer autant de fois que vous vouloir!