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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.81
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
17.04.2010, 11:55     Удалить повторяющиеся слова в строке #1
Здравствуйте!
Как удалить из строки типа char, введенной с помощью cin.getline(buf, 80), одинаковые слова (слова могут быть разделены одним или несколькоми пробелами и знаками табуляции)? В полученной строке слова должны быть разделены только одним пробелом. Можно записать неповторяющиеся слова в новую строку. Но я что-то не могу понять как это сдалать((. Помогите, кто знает

Добавлено через 20 часов 0 минут
Ответ:
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
 
const int SIZE =80;
 
char *pr2 (char *in);
char *pr1 (char *in);
char *copy(char *, char *, int);
int opr (char *a, char *b, int, int);
void ud(char*, char*);
 
void main()
{
    char buf[SIZE],buf2[SIZE], buf3[SIZE]={' '}, outbuf[SIZE]={' '};
 
    while(cout<<"Vvedite 1 stroky: ",
    cin.getline(buf, SIZE))
    {   
        ud(buf, buf3);
 
        cout<<"Rezultat: "<<buf3;
        cout<<endl<<endl;
    }
}
void ud (char *s, char *b)
{
    char *a;
    char *p=b, *z=b; 
    int u=0;
 
    a=pr1(s);
    s=pr2(a);
    b=copy(a,b,s-a);
    
    char *t=b;
 
    while (*(a=pr1(s)))
    {
        s=pr2(a);
        t=z;
        while (*(p=pr1(t)))
        {
            t=pr2(p);
            u=opr(a,p, s-a, t-p);
 
            if(u==0)
                continue;
            else
                break;
        }
        if (u==0)
            b=copy(a,b,s-a);    
    }
}
int opr (char *t, char *r, int len, int len2)
{
    int k=0;
    if (len!=len2)
        return 0;
    else
    {
         for (int j=0; j<len; j++)
         {
             if (*t++==*r++)
                k=1;
            else 
            {
                k=0;
                break;
            }
         }
    return k;
     }      
}
char *pr1(char *in)
{ 
    while (*in&&(*in==' ')||(*in=='\t'))
        in++;
    return in;
}
char *pr2 (char *in)
{
    while (*in&&*in!=' '&&*in!='\t')
        in++;
    return in;
}
char *copy(char * from, char *to, int len)
{
    for (int j=0; (j<len)&&(*to++=*from++); j++)
        ;
    
    *to++=' ';
    *to='\0';
 
    return to;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
17.04.2010, 15:26     Удалить повторяющиеся слова в строке #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <string>
#include <sstream>
#include <set>
#include <iterator>
 
int main(){
    std::string buf, tmp;
    std::set<std::string> set;
    std::cout << "String: ";
    std::getline(std::cin, buf);
    std::istringstream ist(buf);
    while ( ist >> tmp )
        set.insert(tmp);
    std::cout << "Unique words: ";
    std::copy(set.begin(), set.end(), std::ostream_iterator<std::string>(std::cout, " "));
    std::cout << std::endl;
    return 0;
}
yanyk1n
 Аватар для yanyk1n
4324 / 1455 / 152
Регистрация: 12.03.2009
Сообщений: 5,310
17.04.2010, 16:00     Удалить повторяющиеся слова в строке #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
#include <iostream>
#include <cstring>
using namespace std;
 
const int SIZE = 80;
 
int main()
{
    char buf[SIZE];
    cout << "-> ";
    cin.getline(buf, SIZE);
 
    char* words[SIZE];
    int count = 0;    
    char* p = strtok(buf," ");
    bool flag;
    while (p)
    {
        flag = true;
        for (int i = 0; i < count; i++) if (!strcmp(p, words[i]))
        {
            flag = false;
            break;
        }
        if (flag) words[count++] = p; 
        p = strtok(NULL," ");
    }    
    for (int i = 0; i < count ; i++) cout << words[i] << endl;
    return 0;
}
Добавлено через 29 секунд

Не по теме:

easybudda, всё же эта задача на char, а не на контейнеры

NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
17.04.2010, 17:33  [ТС]     Удалить повторяющиеся слова в строке #4
Спасибо за помощь! Просто проблема была в том, что нужно было обойтись без стандартных библиотечных функций... развиваем логику мышления, так сказать . все равно еще раз всем спасбо)
easybudda
17.04.2010, 18:24     Удалить повторяющиеся слова в строке
  #5

Не по теме:

Цитата Сообщение от NNN777 Посмотреть сообщение
нужно было обойтись без стандартных библиотечных функций... развиваем логику мышления
Это больше похоже на "роем траншею столовой ложкой"

Yandex
Объявления
17.04.2010, 18:24     Удалить повторяющиеся слова в строке
Ответ Создать тему
Опции темы

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