Удалить одинаковые слова в строках - 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. После формирования списка, программа выводит все уникальные слова из списка и их частоту. Затем программа выводит слова, которые встречаются более одного раза, и их частоту. Наконец, программа освобождает все выделенные ею ресурсы и завершает работу.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.833 из 5
Похожие ответы