2017-05-05 1 views
-6

J'ai une liste chaînée avec les détails des chansons et je veux comparer deux noms de chansons ... la tâche supplémentaire est de les comparer en ayant plus de mots similaires que de mots différents ... j'utilise strtok pour obtenir mot par mot, puis vérifier si le mot actuel est contenu dans l'autre nom ... mais quand je le fais strtok effacer ma chaîne sauf le premier mot ... comment puis-je échapper à cela?strtok supprime ma chaîne sauf le premier jeton

while (next_token) 
      { 
       currentCounter++; 
       if (searchword(temp->author, next_token)==1) 
       { 
        counter++; 
       } 
       next_token = strtok(NULL, " "); 

      } 
+7

Avez-vous lu la documentation de ce que 'strtok()' * fait * réellement? – EOF

+4

'strtok()' fonctionne en écrasant les délimiteurs avec des octets nuls, de sorte que chaque jeton devienne une chaîne distincte. Si vous avez besoin de la chaîne originale, faites-en une copie avant d'utiliser 'strtok()'. – Barmar

+0

non non .... par exemple temp-> author est "bon jovi" .... à la première itération next_token obtient "bon" mais sur la seconde supprime tout de temp-> author sauf "bon" et ne peut pas aller à –

Répondre

2

strtok modifie le tableau d'entrée en écrasant les délimiteurs avec 0s; ce n'est pas que tout après le premier jeton a été retiré ou effacé, c'est juste que vous avez une terminaison de chaîne suivant le premier jeton, donc rien après l'impression.

Par exemple:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 

int main(void) 
{ 
    char str[] = "This is a test"; 
    printf("before strtok: "); 
    for (size_t i = 0; i < sizeof str; i++) 
    { 
    if (isprint(str[i])) 
     putchar(str[i]); 
    else 
     putchar('.'); 
    } 
    putchar ('\n'); 

    char *token = strtok(str, " "); 
    while (token) 
    { 
    printf("token = %8s, str = ", token); 
    for (size_t i = 0; i < sizeof str; i++) 
    { 
     if (isprint(str[i])) 
     putchar(str[i]); 
     else 
     putchar('.'); 
    } 
    putchar('\n'); 
    token = strtok(NULL, " "); 
    } 

    printf("after all strtok: "); 
    for (size_t i = 0; i < sizeof str; i++) 
    { 
    if (isprint(str[i])) 
     putchar(str[i]); 
    else 
     putchar('.'); 
    } 
    putchar('\n'); 

    return 0; 
} 

est ici la sortie (un . représente un 0 dans ce cas):

before strtok: This is a test. 
token =  This, str = This.is a test. 
token =  is, str = This.is.a test. 
token =  a, str = This.is.a.test. 
token =  test, str = This.is.a.test. 
after all strtok: This.is.a.test. 

Après les strtok appels, tous les autres jetons sont toujours là, mais parce que nous avons remplacé les espaces vides par 0, toutes les routines de traitement de texte habituelles (strcpy, strcat, printf, puts, etc.) ne voient que le premier jeton.

Si vous souhaitez conserver le contenu de la chaîne d'origine, vous devrez les copier dans un autre tampon et exécuter les appels strtok sur ce tampon.

+0

Merci beaucoup John Bode! –