我得到分配检查字符串,并查看其中是否有重复的单词
例如 源字符串:这是一个测试测试。
更改为:这是一个测试。
void RemoveDuplicates(char *fixst) {
char tempstr[N];
char *subst = NULL;
*tempstr = 0;
subst = strtok(fixst, " ");
if ((subst != NULL) && strstr(tempstr, subst) == NULL)
{
strcpy(tempstr, subst);
while ((subst = strtok(NULL, " ")) != NULL)
{
if (strstr(tempstr, subst) == NULL)
{
strcat(tempstr, " ");
strcat(tempstr, subst);
}
}
}
strcpy(fixst, tempstr);
}
这是我的代码,我得到的输出是:这是一个测试
您会看到'is'一词已删除。
另一个字符串:这是对该类的测试测试。
更改为:这是对类的测试。
预期的输出:这是对此类的测试。
还删除单词“ is”和“ this”。
有什么建议吗?
答案 0 :(得分:1)
下面的简单算法遍历输入字符数组中的每个标记/单词。找到新的令牌/单词时,如果满足以下条件之一,则会将其复制到输出字符串中:
在循环的每次迭代中都会更新指向先前令牌的指针,以方便进行比较。
void remove_duplicate_words(char *input) {
size_t input_len = strlen(input);
char *result = (char *)malloc(input_len + 1);
if (!result) {
fprintf(stderr, "Memory allocation failed!");
return;
}
char *last_word = NULL;
char *word = strtok(input, " ");
while (word) {
// Is this either the first word or different from the last word?
if (last_word == NULL || strcmp(word, last_word) != 0) {
// Yes -> append it to the output array
strcat(result, word);
strcat(result, " ");
}
last_word = word;
word = strtok(NULL, " ");
}
puts(result);
free(result);
}
注意:
result
)的内存。 (我们知道它不能长于输入数组)。