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