У меня есть этот алгоритм, который удаляет повторяющиеся слова в строке:
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]);
}
}
}
И мне нужно сделать счетчик повторяющихся слов в строке.
Когда я пытаюсь поставить счетчик в разных местах кода, я всегда получаю неправильные результаты.
@emblox Ваш код не удаляет повторяющиеся слова в строке.
@emblox И слово массива не используется. Так что код не имеет смысла. Также непонятно, почему в этом объявлении используются магические числа 10 и 30 doubleArr[10][30]
Функция gets() получает и считывает структуру из стандартного потока ввода и помещает ее в указанный массив аргументов.
Мой код удаляет повторяющиеся слова и оставляет только одно из списка
И это часть стандарта C больше?
Создайте какую-нибудь глобальную переменную, скажем, int counter = 0;
.
Итак, ваш оператор if
в строке 32 должен выглядеть так:
if (strcmp (doubleArr[i], doubleArr[l]) == 0) {
doubleArr[l][j] = '\0';
counter += 1;
}
Затем вы можете распечатать его, где хотите:
printf("%d", counter);
думаю это ответ....
Чтобы подсчитать дубликаты, просто увеличьте значение счетчика при их обнаружении после теста if (strcmp(doubleArr[i], doubleArr[l]) == 0)
Однако обратите внимание, что в вашем коде есть много небольших проблем:
gets()
k
только тогда, когда текущее слово имеет по крайней мере 1 символ.j > 0
, и используйте k
в остальной части кода вместо k + 1
.Вот модифицированная версия:
#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;
}
Что это за функция
gets()
?