c - 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);
}
}
解决方案
您不能同时使用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()
。
推荐阅读
- php - 对 wordpress 的 SVG 支持
- reactjs - 如何使用 reactjs 验证一些输入?
- flutter - Flutter TextFormFiled inside the Card with elevation
- html - How to make a button on-click to go to another page using HTML?
- javascript - Return type of a text box
- swift - UICollectionViewCell 内的 UITableView 重用错误的单元格
- linux - 如何让 Bitbucket 管道使用的 SSH 用户只能访问特定目录?
- mongodb - How to aggregate lookup sub array documents in mongoDB, and projecting the result?
- vue.js - Vuejs add dynamic table row based on searchkey
- c# - 如何从 C# 调用 COM 对象