Как добавить счетчик для удаления повторяющихся слов в строковом алгоритме?

У меня есть этот алгоритм, который удаляет повторяющиеся слова в строке:

int main()
{
    char str[100], word[100], doubleArr[10][30];
    int i = 0, j = 0, k = 0, len1 = 0, len2 = 0, l = 0, n, c = 0;

    printf("Enter the string\n");
    gets(str);
    n = strlen(str);

    for (i = 0; str[i] != '\0'; i++) {
        if (str[i] == ' ') {
            doubleArr[k][j] = '\0';
            k++;
            j = 0;
        } else {
            doubleArr[k][j] = str[i];
            j++;
        }
    }

    doubleArr[k][j] = '\0';

    j = 0;
    for (i = 0; i < k; i++) {
        for (l = 1; l < k + 1; l++) {
            if (doubleArr[l][j] == '\0' || l == i) {
                continue;
            }

            if (strcmp(doubleArr[i], doubleArr[l]) == 0) {
                doubleArr[l][j] = '\0';
            }
        }
    }

    j = 0;

    for (i = 0; i < k + 1; i++) {
        if (doubleArr[i][j] == '\0') {
            continue;
        } else {
            printf("%s ", doubleArr[i]);
        }
    }
}

И мне нужно сделать счетчик повторяющихся слов в строке.

Когда я пытаюсь поставить счетчик в разных местах кода, я всегда получаю неправильные результаты.

Что это за функция gets()?

Haris 02.04.2023 15:14

@emblox Ваш код не удаляет повторяющиеся слова в строке.

Vlad from Moscow 02.04.2023 15:14

@emblox И слово массива не используется. Так что код не имеет смысла. Также непонятно, почему в этом объявлении используются магические числа 10 и 30 doubleArr[10][30]

Vlad from Moscow 02.04.2023 15:16

Функция gets() получает и считывает структуру из стандартного потока ввода и помещает ее в указанный массив аргументов.

emblox 02.04.2023 15:28

Мой код удаляет повторяющиеся слова и оставляет только одно из списка

emblox 02.04.2023 15:28

И это часть стандарта C больше?

Haris 02.04.2023 15:36
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
6
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Создайте какую-нибудь глобальную переменную, скажем, int counter = 0;.

Итак, ваш оператор if в строке 32 должен выглядеть так:

    if (strcmp (doubleArr[i], doubleArr[l]) == 0) {
            doubleArr[l][j] = '\0';
            counter += 1;
    }

Затем вы можете распечатать его, где хотите:

    printf("%d", counter);

думаю это ответ....

dummy_programmer 02.04.2023 15:56
Ответ принят как подходящий

Чтобы подсчитать дубликаты, просто увеличьте значение счетчика при их обнаружении после теста if (strcmp(doubleArr[i], doubleArr[l]) == 0)

Однако обратите внимание, что в вашем коде есть много небольших проблем:

  • вы никогда не должны использовать gets()
  • вы должны увеличивать количество слов k только тогда, когда текущее слово имеет по крайней мере 1 символ.
  • количество слов может быть неправильным, если предложение не заканчивается пробелом: увеличивайте его после конца цикла, если j > 0, и используйте k в остальной части кода вместо k + 1.
  • код имеет неопределенное поведение, если любое из слов длиннее 29 символов или если имеется более 10 слов из-за переполнения буфера.

Вот модифицированная версия:

#include <stdio.h>
#include <string.h>

int main(void) {
    char str[100], words[50][100];
    int i, j, k, n, dup;

    // input the string with fgets
    printf("Enter the string\n");
    if (!fgets(str, sizeof str, stdin))
        return 1;

    // extract the words from the string
    j = n = 0;
    for (i = 0; str[i] != '\0'; i++) {
        // use space and newline as word separators
        if (str[i] == ' ' || str[i] == '\n') {
            if (j > 0) {
                // add a new word if not empty
                words[n][j] = '\0';
                n++;
                j = 0;
            }
        } else {
            words[n][j] = str[i];
            j++;
        }
    }

    // add the last word if not empty
    if (j > 0) {
        words[n][j] = '\0';
        n++;
    }

    // remove duplicates
    dup = 0;
    k = 0;
    for (i = 0; i < n; i++) {
        for (j = 0; j < k; j++) {
            if (strcmp(words[i], words[j]) == 0)
                break;
        }
        if (j == k) {
            // keep this word
            if (i != k) {
                strcpy(words[k], words[i]);
            }
            k++;
        } else {
            // omit this word
            dup++;
        }
    }
    // update word count
    n = k;

    // output the word list
    for (i = 0; i < n; i++) {
        printf("%s%c", words[i], " \n"[i == n - 1]);
    }
    printf("%d duplicates\n", dup);
    return 0;
}

Другие вопросы по теме