Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/120: Рейтинг темы: голосов - 120, средняя оценка - 4.97
27 / 27 / 6
Регистрация: 27.09.2009
Сообщений: 101

Удаление повторяющихся слов из стоки на C

23.12.2009, 01:51. Показов 23424. Ответов 8

Студворк — интернет-сервис помощи студентам
Здравствуйте. Помогите пожалуйста реализовать задачу: Дана строка. Группа символов разделленая одним или несколькими пробелами считается словом. Необходимо удалить из строки все повторные вхождения слов. Похожие темы были,но полностью завершенных я не нашел и поэтому создал новую тему.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.12.2009, 01:51
Ответы с готовыми решениями:

Удаление повторяющихся слов - deque
Привет всем!У меня программа,которая удаляет повторяющиеся слова. Например входные данные: 4 черный белый черный синий Выход: ...

Как реализовать удаление повторяющихся слов?
Задачей является написание программы, которая: 1) Считывает вводимый в консоль текст до точки. 2) Выкидывает все символы, кроме...

Удаление повторяющихся соседних слов из текста
Помогите, пожалуйста, написать прогу: вводит строку (текст) из файла, удаляет в ней повторяющиеся рядом стоящие слова, и выводит...

8
Псевдо программист
 Аватар для R0mm
192 / 113 / 37
Регистрация: 19.09.2009
Сообщений: 303
23.12.2009, 09:18
"берешь" первое слово. ищешь его вхождения в исходной строке.
если таковые есть - удаляешь пока не кончатся вхождения
"берешь следущее слово

а так же
Описание функций C (Си) / C++ - strstr


#include требуется только для объявления функции

char *strstr(srting1,string2);
char *string1; поисковая строка
char *string2; строка-шаблон

Описание.

Функция strstr возвращает указатель на первое вхождение
string1 в string2.

Возвращаемое значение.

Функция strstr возвращает указатель на string1, если
string1 обнаружена, и NULL - если string1 нет.
См. также strcspn.

Пример.

#include

C++
1
2
3
4
5
6
7
main()
{
char *string1="needle in a haystack";
char *string2="hay";
 
printf("%sn", strstr(string1,string2));
}
На выходе:
haystack
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,977
23.12.2009, 09:55
Ну или строку в массив слов и удалить повторяющиеся...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
/* 
    удалить из строки все повторные вхождения слов
*/
 
int main(void){
    char **words, *pWord, buf[BUFSIZ];
    size_t size, i, j;
    
    while ( 1 ){ /* бесклнечный цикл */
        printf("\nString: ");
        if ( !fgets(buf, BUFSIZ, stdin) ){ /* прочитать строку */
            fprintf(stderr, "Can't get string!\n");
            exit(1);
        }
        if ( pWord = strrchr(buf, '\n') )
            *pWord = '\0'; /* удалить символ перевода строки */
        
        if ( !*buf )
            break; /* если строка пустая - на выход */
        
        /* разделение строки на массив слов */
        words = NULL;
        size = 0;
        for ( pWord = strtok(buf, " \t"); pWord != NULL; pWord = strtok(NULL, " \t") ){
            if ( ( words = (char**)realloc(words, sizeof(char*) * (size + 1)) ) == NULL ){
                fprintf(stderr, "Memory error!\n");
                exit(1);
            }
            if ( ( words[size] = strdup(pWord) ) == NULL ){
                fprintf(stderr, "Memory error!\n");
                exit(1);
            }
            ++size;
        }
        if ( !words ){
            fprintf(stderr, "Can't find some words!\n");
            exit(1);
        }
        
        /* поиск и удаление повторяющихся слов */
        for ( i = 0; i < size - 1; ++i ){
            if ( !*words[i] )
                continue;
            for ( j = i + 1; j < size; ++j ){
                if ( !strcmp(words[i], words[j]) ){
                    *(words[j]) = '\0';
                }
            }
        }
    
        /* вывод слов с пробелами */
        for ( i = 0; i < size; ++i )
            if ( *(words[i]) )
                printf("%s ", words[i]);
        printf("\n");
    
        /* очистка памяти */
        do {
            free(words[--size]);
        } while ( size );
        free(words);
    }
    
    /* завершение программы */
    exit(0);
}
1
27 / 27 / 6
Регистрация: 27.09.2009
Сообщений: 101
23.12.2009, 16:48  [ТС]
Спасибо, программа работает как надо, но преподаватель выдвинул новое условие: надо чтоб удалялись только повторяющиеся слова, а пробелы оставались. Как бы это передалать чтоб пробелы оставались???
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,977
23.12.2009, 20:29
Цитата Сообщение от Vivo Посмотреть сообщение
Как бы это передалать чтоб пробелы оставались?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
...
/* поиск и удаление повторяющихся слов */
for ( i = 0; i < size - 1; ++i ){
    if ( *words[i] == ' ' )
        continue;
    for ( j = i + 1; j < size; ++j )
        if ( !strcmp(words[i], words[j]) )
            strcpy(words[j], " ");
}
/* вывод слов с пробелами */
for ( i = 0; i < size; ++i )
    printf( ( *(words[i]) == ' ' ) ? "%s" : "%s ", words[i]);
printf("\n");
...
0
27 / 27 / 6
Регистрация: 27.09.2009
Сообщений: 101
24.12.2009, 02:55  [ТС]
Чего-то этот вариант не работает. Он выводит на 1-н пробел больше.
Пример:
Вводим: " 12 12 123"
он выводит: "12 123"
А надо: " 12 123";

Добавлено через 11 минут
Вот получившийся код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main(){
        char **words, *pWord, buf[BUFSIZ];
        int size, i, j;
                printf("Vvedite stroku:\n");
                fgets(buf, BUFSIZ, stdin); 
 
                /* разделение строки на массив слов */
                words = NULL;
                size = 0;
                for ( pWord = strtok(buf, " \t"); pWord != NULL; pWord = strtok(NULL, " \t") )
                {
               if ( ( words = (char**)realloc(words, sizeof(char*) * (size + 1)) ) == NULL ){
 
               }
                   words[size] = strdup(pWord);
                       ++size;
                }
                        
                printf("Poluchenaya stroka:\n");
                for ( i = 0; i < size - 1; ++i )
            {
                    if ( *words[i] == ' ' )
                    continue;
                    for ( j = i + 1; j < size; ++j )
                    if ( !strcmp(words[i], words[j]) )
                    strcpy(words[j], " ");
                }
        /* вывод слов с пробелами */
                for ( i = 0; i < size; ++i )
            printf( ( *(words[i]) == ' ' ) ? "%s" : "%s ", words[i]);
}
Пришлось многое удалить из-за того, что преподаватель сказал не пользоваться функциями библиотеки string.h.
Но еще осталось многое, что я не могу не удалить и не заменить. Не могли бы помочь теперь заменить функции string.h на чтонибудь другое??? И можноли как нибудь сразу выделить память,чтобы не использовать функцию realloc?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,977
24.12.2009, 09:25
Vivo, Чувство такое, что над вами препод глумится просто. Ведущие пробелы пропускаются, что не удивительно, а вместо повторяющихся слов лишний пробел добавляется. Если обязательно сохранять и те пробелы, которые перед первым словом, а ещё круче - все пробелы точно в том количестве, в котором они в тексте были, так это программа экрана на три получится. Да и по поводу string.h тоже не понятно... Чем она-то не угодила? Обойтись, конечно, можно, если самому strlen() strdup() strcmp() написа'ть, ну и аналог strtok() какой-нибудь. Последний на форуме есть - точно знаю, сам писа'л! Да и остальные, если поискать, найдутся... Память под массив указателей сразу выделять можно, если какую-нибудь считалку слов в предложении сделать (тоже есть на форуме, ищите)...

Не по теме:

Вот такими методами обучения по-моему и прививают ненависть к компьютерам вообще, и к программированию на языке С в частности.

0
27 / 27 / 6
Регистрация: 27.09.2009
Сообщений: 101
24.12.2009, 17:02  [ТС]
Цитата Сообщение от easybudda Посмотреть сообщение
Не по теме:
Вот такими методами обучения по-моему и прививают ненависть к компьютерам вообще, и к программированию на языке С в частности.
Полностью согласен
Цитата Сообщение от easybudda Посмотреть сообщение
Если обязательно сохранять и те пробелы, которые перед первым словом, а ещё круче - все пробелы точно в том количестве, в котором они в тексте были, так это программа экрана на три получится.
А случайно нету кода такой программы???Или хотяб программы похожей на неё, просто безвыходная ситуация, надо к субботе сдать, но препод настолько суровый, что от своих требований не отступит ,а первый экзамен уже во вторник, а без сданной лабораторной допуска к экзаменам нету.
0
1 / 1 / 0
Регистрация: 18.04.2011
Сообщений: 20
03.05.2011, 22:14
как написать эту задачу на С++?????
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.05.2011, 22:14
Помогаю со студенческими работами здесь

Найти ошибку: удаление повторяющихся слов из строки
Написал программу, которая должна удалить из строки повторяющиеся слова. слова разделены только пробелом компилятор ни на что не...

Сдвиг стоки вниз и Удаление столбцов Матрицы
Добрый день! Возник вопрос! Как правильно сдвигать строчку в матрице? (своего рода сортировка) Мне нужно указанную строку переместить...

Запись всех повторяющихся слов в новый массив слов
компилируется без ошибок, запускаю консоль после 13 строчки, а именно ввода количества слов, программа где-то вылетает, думал на 15 что-то...

Удаление повторяющихся слов
Ребята, пишу первое регулярное выражение. Нужно удалить повторяющиеся слова в строке без учета регистра. Я сделал так: echo 'Вот,...

Удаление повторяющихся слов
Задание: из текста, который вводит пользователь, нужно удалить повторяющиеся слова. Пример: просто просто -&gt; просто Оно то так...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru