удалить повторяющиеся слова в массиве - PullRequest
0 голосов
/ 13 июня 2019

Я получил задание проверить строку и посмотреть, есть ли внутри нее повторяющиеся слова

, например, Исходная строка: это тестовый тест.

изменяется на: это тест.

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 Ответ

1 голос
/ 13 июня 2019

Простой алгоритм ниже перебирает каждый токен / слово во входном массиве символов. Когда он находит новый токен / слово, он копирует его в выходную строку, если либо:

  • это самый первый токен, или
  • отличается от последнего токена

Указатель на предыдущий токен обновляется в каждой итерации цикла - для облегчения сравнения.

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) распределяется динамически - в зависимости от длины входной строки. (Мы знаем, что он не может быть длиннее входного массива).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...