Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 46, средняя оценка - 4.83
Vivo
23 / 23 / 2
Регистрация: 27.09.2009
Сообщений: 101
23.12.2009, 01:51     Удаление повторяющихся слов из стоки на C #1
Здравствуйте. Помогите пожалуйста реализовать задачу: Дана строка. Группа символов разделленая одним или несколькими пробелами считается словом. Необходимо удалить из строки все повторные вхождения слов. Похожие темы были,но полностью завершенных я не нашел и поэтому создал новую тему.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
R0mm
Псевдо программист
 Аватар для R0mm
192 / 113 / 15
Регистрация: 19.09.2009
Сообщений: 303
23.12.2009, 09:18     Удаление повторяющихся слов из стоки на C #2
"берешь" первое слово. ищешь его вхождения в исходной строке.
если таковые есть - удаляешь пока не кончатся вхождения
"берешь следущее слово

а так же
Описание функций 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
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
23.12.2009, 09:55     Удаление повторяющихся слов из стоки на C #3
Ну или строку в массив слов и удалить повторяющиеся...
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);
}
Vivo
23 / 23 / 2
Регистрация: 27.09.2009
Сообщений: 101
23.12.2009, 16:48  [ТС]     Удаление повторяющихся слов из стоки на C #4
Спасибо, программа работает как надо, но преподаватель выдвинул новое условие: надо чтоб удалялись только повторяющиеся слова, а пробелы оставались. Как бы это передалать чтоб пробелы оставались???
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
23.12.2009, 20:29     Удаление повторяющихся слов из стоки на C #5
Цитата Сообщение от 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");
...
Vivo
23 / 23 / 2
Регистрация: 27.09.2009
Сообщений: 101
24.12.2009, 02:55  [ТС]     Удаление повторяющихся слов из стоки на C #6
Чего-то этот вариант не работает. Он выводит на 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?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
24.12.2009, 09:25     Удаление повторяющихся слов из стоки на C #7
Vivo, Чувство такое, что над вами препод глумится просто. Ведущие пробелы пропускаются, что не удивительно, а вместо повторяющихся слов лишний пробел добавляется. Если обязательно сохранять и те пробелы, которые перед первым словом, а ещё круче - все пробелы точно в том количестве, в котором они в тексте были, так это программа экрана на три получится. Да и по поводу string.h тоже не понятно... Чем она-то не угодила? Обойтись, конечно, можно, если самому strlen() strdup() strcmp() написа'ть, ну и аналог strtok() какой-нибудь. Последний на форуме есть - точно знаю, сам писа'л! Да и остальные, если поискать, найдутся... Память под массив указателей сразу выделять можно, если какую-нибудь считалку слов в предложении сделать (тоже есть на форуме, ищите)...

Не по теме:

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

Vivo
23 / 23 / 2
Регистрация: 27.09.2009
Сообщений: 101
24.12.2009, 17:02  [ТС]     Удаление повторяющихся слов из стоки на C #8
Цитата Сообщение от easybudda Посмотреть сообщение
Не по теме:
Вот такими методами обучения по-моему и прививают ненависть к компьютерам вообще, и к программированию на языке С в частности.
Полностью согласен
Цитата Сообщение от easybudda Посмотреть сообщение
Если обязательно сохранять и те пробелы, которые перед первым словом, а ещё круче - все пробелы точно в том количестве, в котором они в тексте были, так это программа экрана на три получится.
А случайно нету кода такой программы???Или хотяб программы похожей на неё, просто безвыходная ситуация, надо к субботе сдать, но препод настолько суровый, что от своих требований не отступит ,а первый экзамен уже во вторник, а без сданной лабораторной допуска к экзаменам нету.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2011, 22:14     Удаление повторяющихся слов из стоки на C
Еще ссылки по теме:

C++ Количество повторяющихся слов
C++ Поиск повторяющихся слов
Как реализовать удаление повторяющихся слов? C++

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

Или воспользуйтесь поиском по форуму:
протест
0 / 0 / 0
Регистрация: 18.04.2011
Сообщений: 20
03.05.2011, 22:14     Удаление повторяющихся слов из стоки на C #9
как написать эту задачу на С++?????
Yandex
Объявления
03.05.2011, 22:14     Удаление повторяющихся слов из стоки на C
Ответ Создать тему

Метки
Строки
Опции темы

Текущее время: 12:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru