删除数组中重复的以下单词

时间:2019-06-13 07:50:39

标签: c

我得到分配检查字符串,并查看其中是否有重复的单词

例如 源字符串:这是一个测试测试。

更改为:这是一个测试。

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”。

有什么建议吗?

1 个答案:

答案 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)的内存。 (我们知道它不能长于输入数组)。