Удалить одинаковые слова в строках - C (СИ)
Формулировка задачи:
Здравствуйте, нужно ввести строку не более 200 символов, удалить из нее повторяющиеся слова (не повторные вхождения), вывести нужно 3 вещи: строку без повторяющихся слов, строку со словами, которые повторяются, и количество этих слов.
То есть, если на ввод у нас : hello my little world hello
Вывод будет таким:
my little world
hello
1
Делать нужно без cin, cout всяких, на чистом C (по возможности). Функции со строками желательно писать самому. После некоторых умственных усилий я запуталась. Решила сделать ввод строки, потом каждое слово закинуть в строку нового двумерного массива и там уже сравнивать, но мысль дальше не идет, все получается чересчур громоздко и уже порядком устаешь.
Вот мой код, здесь сравнение строк не правильное, он сравнивает сначала первые буквы, потом вторые и т.д. Есть идея создать одномерный массив, где будут длины слов, но куда это впихнуть уже не знаю.
В общем, либо помогите доделать эту программу(если есть вопросы по коду - спрашивайте), либо предложите что-нибудь новое. Моих мозгов уже не хватает. Буду очень благодарна!
int i=0;
int j=0;
int x=0;
int m=0;
int swit1=1;
int swit2=0;
char str[201];
//Ввод строки
gets_s(str);
//Cоздаем двумерный массив символов
char** buf=new char* [100];
for (int k=0;k<100;k++)
buf[k]=new char ;
//for (int k=0;k<100;k++)
//for (int l=0;l<100;l++)
//buf[k][0]='\0';
//Распределяем слова из строки str в промежуточный двумерный массив buf
while (swit1==1)
{
while (str[x]!='\0' && str[x]!=' ')
{
swit2=1;
buf[i][j]=str[x];
x++;
j++;
}
if (str[x]=='\0') swit1=0;
if (swit2==1)
{
buf[i][j]='\0';
i++;
}
swit2=0;
x++;
j=0;
}
m=i+1;
//Сравниваем строки
int count=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<100;j++)
{
for(int k=0;k<m;k++)
{
if(k!=i)
{
if(buf[i][j]==buf[k][j])
count ++;
}
}
}
}
printf("%d", count);Решение задачи: «Удалить одинаковые слова в строках»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct WRD {
const char * ptr;
size_t count;
struct WRD * next;
} wrd_t;
int add_word(wrd_t ** list, const char * word) {
if ( ! *list ) {
if ( ! ( *list = malloc(sizeof(wrd_t)) ) ) {
perror("malloc");
return -1;
}
(*list)->ptr = word;
(*list)->count = 1;
(*list)->next = NULL;
return 0;
}
else if ( strcmp((*list)->ptr, word) == 0 ) {
(*list)->count += 1;
return 0;
}
else
return add_word(&((*list)->next), word);
}
#define DELIM " \t\n"
int main(void) {
char buf[BUFSIZ];
while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' ) {
wrd_t * list = NULL;
wrd_t * current;
char * word;
size_t doubling;
for ( word = strtok(buf, DELIM); word != NULL; word = strtok(NULL, DELIM) ) {
if ( add_word(&list, word) ) {
fprintf(stderr, "Memory error!\n");
exit(1);
}
}
printf("Single words: ");
for ( current = list; current != NULL; current = current->next ) {
if ( current->count == 1 )
printf("%s ", current->ptr);
}
printf("\nDoubling words:\n");
for ( doubling = 0, current = list; current != NULL; current = current->next ) {
if ( current->count > 1 && ++doubling )
printf("%s\t(%u)\n", current->ptr, current->count);
}
printf("%u different word(s) have doublings.\n", doubling);
while ( list ) {
current = list->next;
free(list);
list = current;
}
}
exit(0);
}
Объяснение кода листинга программы
Код представляет собой программу на языке C, которая использует структуру данных слово-частота (wrd_t) для подсчета количества вхождений каждого слова в строке ввода.
Список слов формируется в цикле, в котором каждое слово в строке ввода добавляется в список. Если слово уже присутствует в списке, его частота увеличивается. Если слово отсутствует, оно добавляется в список со значением частоты 1.
После формирования списка, программа выводит все уникальные слова из списка и их частоту.
Затем программа выводит слова, которые встречаются более одного раза, и их частоту.
Наконец, программа освобождает все выделенные ею ресурсы и завершает работу.