首页 > 解决方案 > strtok 问题以比较 strtok 函数的嵌套结果中的两个单词

问题描述

我正在寻找将数组中的单词与另一个数组中的字典中的单词进行比较,以查找找到的最大单词数

我使用了 strtok,因为两者中的单词都用空格分隔,但它不起作用。我需要你的帮助

 void chercherScoreMotDansDico(char msgBootforce [], int* 
 maxCorrepondance, char* mot, char* dicoActuel, char* 
 bonResultatBootforce) {
     int i = 0;
     char* motdico = NULL;
     char tmpMsgBootForce [3000] = {0};

     strcpy(tmpMsgBootForce, msgBootforce);

     mot = strtok (tmpMsgBootForce, " ");

     while (mot != NULL) {
          motdico = strtok (dicoActuel, " ");

          while (motdico != NULL) {
              if (strcmp(mot,motdico) == 0)   ++i;
              motdico = strtok (NULL, " ");
          }

          mot = strtok (NULL," ");  
    }

    if (i > *(maxCorrepondance)) {
        *(maxCorrepondance) = i;
        strcat(bonResultatBootforce, msgBootforce);
    }   
 }

标签: c

解决方案


您不能同时使用strtok()两个不同的字符串。strtok()有一个内部指针,它存储正在处理的当前字符串的地址。如果你strtok()用一个字符串调用,然后strtok()用另一个字符串调用,那么当你这样做strtok(NULL, delim)时,它将继续使用指定的最后一个字符串。

https://en.cppreference.com/w/c/string/byte/strtok

这个函数是破坏性的:它在字符串 str 的元素中写入 '\0' 字符。特别是,字符串文字不能用作 strtok 的第一个参数。每次调用 strtok 都会修改一个静态变量:不是线程安全的。与大多数其他标记器不同,strtok 中的分隔符对于每个后续标记都可以不同,甚至可以取决于先前标记的内容。strtok_s 函数与 POSIX strtok_r 函数的不同之处在于防止存储在被标记化的字符串之外,并检查运行时约束。

strtok()该函数有一个新版本,strtok_s()它有一个额外的地址参数,供指针变量使用,而不是使用的内部指针变量strtok()


推荐阅读