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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
#1

Аналог std::string - C++

01.12.2013, 10:55. Просмотров 598. Ответов 6
Метки нет (Все метки)

Имеется некоторый класс, обеспечивающий работу с символами UTF-8. Назовём его uchar. Можно ли простым способом организовать класс ustring, полностью соответствующий по принципу взаимодействия с std::string с заменой char на uchar?

Вот реализация класса uchar (пока сырая, сильно не пинайте)
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#ifndef UTF_8
#define UTF_8
#include <iostream>
#include <stdio.h>
#include <string>
 
class uchar
{
    public:
        unsigned char _c[6];
        unsigned int size;
        uchar()
        {
            size=0;
        }
        uchar(unsigned char _rf)
        {
            size=1;
            _c[0]=_rf;
        }
        uchar(std::string _rf)
        {
            _c[0]=_rf[0];
            size=1;
            unsigned int _i,_r=191,_p=32;
            while(_c[0]>_r)
            {
                size++;
                _r+=_p;
                _p/=2;
            }
            for(_i=1;_i<size;_i++)
                _c[_i]=_rf[_i];             
        }
};
 
bool operator ==(uchar _a,uchar _b);
{
    unsigned int _i;
    if(_a.size!=_b.size)
        return false;
    for(_i=0;_i<_a.size;_i++)
        if(_a[_i]!=_b[_i])
            return false;
    return true;
}
 
bool operator !=(uchar _a,uchar _b)
{
    unsigned int _i;
    if(_a.size!=_b.size)
        return true;
    for(_i=0;_i<_a.size;_i++)
        if(_a[_i]!=_b[_i])
            return true;
    return false;
}
 
bool operator <(uchar _a,uchar _b)
{
    if(_a.size==_b.size)
    {
        unsigned int _i=0;
        while(_i<_a.size&&_a[i]==_b[i])
            i++;
        return _a[i]<_b[i];
    }
    return _a.size<_b.size;
}
 
bool operator <=(uchar _a,uchar_b)
{
    return (_a<_b||_a==_b);
}
 
bool operator >(uchar _a,uchar _b)
{
    if(_a.size==_b.size)
    {
        unsigned int _i=0;
        while(_i>_a.size&&_a[i]==_b[i])
            i++;
        return _a[i]>_b[i];
    }
    return _a.size>_b.size;
}
 
bool operator >=(uchar _a,uchar_b)
{
    return (_a>_b||_a==_b);
}
 
std::istream& operator >>(std::istream &_is,uchar &_uc)
{
    unsigned int _i,_r=191,_p=32;
    _is>>_uc._c[0];
    _uc.size=1;
    while(_uc._c[0]>_r)
    {
        _uc.size++;
        _r+=_p;
        _p/=2;
    }
    for(_i=1;_i<_uc.size;_i++)
        _is>>_uc._c[_i];
    return _is;
};
 
std::ostream& operator <<(std::ostream &_os,uchar &_uc)
{
    unsigned int _i;
    for(_i=0;_i<_uc.size;_i++)
        _os<<_uc._c[_i];
    return _os;
}
 
typedef 
 
#endif
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.12.2013, 10:55     Аналог std::string
Посмотрите здесь:

std::string C++
std::string Трим C++
Аналог метода Split для std::string C++
C++ Аналог std::replace.
std:string C++
Собственный динамический массив (аналог std::vector) C++
C++ std::string
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12877 / 7263 / 810
Регистрация: 27.09.2012
Сообщений: 17,940
Записей в блоге: 2
Завершенные тесты: 1
01.12.2013, 11:06     Аналог std::string #2
вот что такое std::string:
C++
1
typedef basic_string<char> string;
Jupiter
Каратель
Эксперт С++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.12.2013, 11:40     Аналог std::string #3
chromium вам в пример
k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
02.12.2013, 14:38  [ТС]     Аналог std::string #4
Да, я знаю что из себя представляют стандартные строки. Я смог наладить работу расширенных символов, но когда делаю расширенные строки... Короче, два вопроса: как после typedef добавить конструктор (дабы задавать широкую строку обычной) и как сделать к ним рабочий аналог getline (второе через первое решается).
k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
04.12.2013, 10:54  [ТС]     Аналог std::string #5
Почему-то люди просто перестают отвечать в темах после второго сооющения от автора темы... Вопрос о конструкторе для аналога остаётся открытым!
Jupiter
Каратель
Эксперт С++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
04.12.2013, 11:02     Аналог std::string #6
Цитата Сообщение от k1-801 Посмотреть сообщение
дабы задавать широкую строку обычной
создай статический метод типа fromStdString, конструктор можно добавить только отнаследовавшись

Добавлено через 1 минуту
Цитата Сообщение от k1-801 Посмотреть сообщение
и как сделать к ним рабочий аналог getline (второе через первое решается).
написать свой
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2013, 00:14     Аналог std::string
Еще ссылки по теме:

std::string, потоки C++
Std::string compare C++
C++ А есть какой нибудь широкий аналог std::ofstream?
Std::string C++
C++ Реализовать аналог класса std::string с помощью vector

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

Или воспользуйтесь поиском по форуму:
k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
05.12.2013, 00:14  [ТС]     Аналог std::string #7
Цитата Сообщение от Jupiter Посмотреть сообщение
создай статический метод типа fromStdString, конструктор можно добавить только отнаследовавшись

Добавлено через 1 минуту

написать свой
Я вас правильно понял?
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
//ustring beginning
class ustring: public basic_string<uchar>
{
    public:
        ustring(std::string _rf)
        {
            unsigned int _i;
            uchar _tuc;
            for(_i=0;_i<_rf.size();_i+=_tuc.size)
            {
                _tuc=_rf.substr(_i,MAX_UTF_8_SIZE);
                push_back(_tuc);
            }
        }
};
 
//streaming
std::istream& operator >>(std::istream& _is, ustring& _us)
{
    uchar _tuc='0';
    while(_tuc!='\n'&&_tuc!=' '&&_tuc!='    ')
    {
        _is>>_tuc;
        _us.push_back(_tuc);
    }
    return _is;
};
 
std::ostream& operator <<(std::ostream& _os, ustring& _us)
{
    unsigned int _i;
    for(_i=0;_i<_us.size();_i++)
        _os<<_us[_i];
    return _os;
}
 
//getline
std::istream& getline (istream& is, ustring& ustr, char delim)
{
    ustr.clear();
    std::string _ts;
    getline(is,_ts,delim);
    ustr=_ts;
    return is;
}
std::istream& getline (istream& is, ustring& ustr)
{
    ustr.clear();
    std::string _ts;
    getline(is,_ts);
    ustr=_ts;
    return is;
}
/**/
#endif
Добавлено через 7 часов 56 минут
Оно не заработало... Можно подобный но рабочий пример? У меня пока с наследованием... Никак.

Добавлено через 1 час 19 минут
В общем, понятия не имею как но я получил рабочее это.
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
#ifndef UTF_8
#define UTF_8
#define MAX_UTF_8_SIZE 6
#include <iostream>
#include <stdio.h>
#include <string>
 
class uchar
{
    public:
        unsigned char _c[MAX_UTF_8_SIZE];
        unsigned int size;
        uchar()
        {
            size=0;
        }
        uchar(const uchar& _rf)
        {
            unsigned int _i;
            size=_rf.size;
            for(_i=0;_i<size;_i++)
                _c[_i]=_rf._c[_i];
        }
        uchar(unsigned char _rf)
        {
            size=1;
            _c[0]=_rf;
        }
        uchar(const char* _rf) //for constructions uchar="";
        {
             _c[0]=_rf[0];
            size=1;
            unsigned int _i,_r=191,_p=32;
            while(_c[0]>_r)
            {
                size++;
                _r+=_p;
                _p/=2;
            }
            for(_i=1;_i<size&&_rf[_i]!='\0';_i++)
                _c[_i]=_rf[_i];
        }
        uchar(std::string _rf)
        {
            _c[0]=_rf[0];
            size=1;
            unsigned int _i,_r=191,_p=32;
            while(_c[0]>_r)
            {
                size++;
                _r+=_p;
                _p/=2;
            }
            for(_i=1;_i<size&&_i<_rf.size();_i++)
                _c[_i]=_rf[_i];             
        }
};
 
bool operator ==(uchar _a, uchar _b)
{
    unsigned int _i;
    if(_a.size!=_b.size)
        return false;
    for(_i=0;_i<_a.size;_i++)
        if(_a._c[_i]!=_b._c[_i])
            return false;
    return true;
}
 
bool operator !=(uchar _a, uchar _b)
{
    unsigned int _i;
    if(_a.size!=_b.size)
        return true;
    for(_i=0;_i<_a.size;_i++)
        if(_a._c[_i]!=_b._c[_i])
            return true;
    return false;
}
 
bool operator <(uchar _a, uchar _b)
{
    if(_a.size==_b.size)
    {
        unsigned int _i=0;
        while(_i<_a.size&&_a._c[_i]==_b._c[_i])
            _i++;
        return _a._c[_i]<_b._c[_i];
    }
    return _a.size<_b.size;
}
 
bool operator <=(uchar _a, uchar _b)
{
    return (_a<_b||_a==_b);
}
 
bool operator >(uchar _a, uchar _b)
{
    if(_a.size==_b.size)
    {
        unsigned int _i=0;
        while(_i>_a.size&&_a._c[_i]==_b._c[_i])
            _i++;
        return _a._c[_i]>_b._c[_i];
    }
    return _a.size>_b.size;
}
 
bool operator >=(uchar _a, uchar _b)
{
    return (_a>_b||_a==_b);
}
 
std::istream& operator >>(std::istream& _is, uchar& _uc)
{
    unsigned int _i,_r=191,_p=32;
    _is>>_uc._c[0];
    _uc.size=1;
    while(_uc._c[0]>_r)
    {
        _uc.size++;
        _r+=_p;
        _p/=2;
    }
    for(_i=1;_i<_uc.size;_i++)
        _is>>_uc._c[_i];
    return _is;
};
 
std::ostream& operator <<(std::ostream& _os, uchar& _uc)
{
    unsigned int _i;
    for(_i=0;_i<_uc.size;_i++)
        _os<<_uc._c[_i];
    return _os;
}
 
 
//ustring beginning
class ustring: public basic_string<uchar>
{
    public:
        ustring():basic_string<uchar>()
        {
            
        }
        ustring(const char* _rf):basic_string<uchar>() //for constructions ustring="";
        {
            unsigned int _i;
            uchar _tuc;
            for(_i=0;_i<_rf[_i]!='\0';_i+=_tuc.size)
            {
                _tuc=&_rf[_i];
                push_back(_tuc);
            };
        }
        ustring(std::string _rf):basic_string<uchar>()
        {
            unsigned int _i;
            uchar _tuc;
            for(_i=0;_i<_rf.size();_i+=_tuc.size)
            {
                _tuc=_rf.substr(_i,MAX_UTF_8_SIZE);
                push_back(_tuc);
            };
        }
};
 
//streaming
std::istream& operator >>(std::istream& _is, ustring& _us)
{
    uchar _tuc='0';
    while(_tuc!='\n'&&_tuc!=' '&&_tuc!='    ')
    {
        _is>>_tuc;
        _us.push_back(_tuc);
    }
    return _is;
};
 
std::ostream& operator <<(std::ostream& _os, ustring& _us)
{
    unsigned int _i;
    for(_i=0;_i<_us.size();_i++)
        _os<<_us[_i];
    return _os;
}
 
//getline
std::istream& getline (istream& is, ustring& ustr, char delim)
{
    ustr.clear();
    std::string _ts;
    getline(is,_ts,delim);
    ustr=_ts;
    return is;
}
std::istream& getline (istream& is, ustring& ustr)
{
    ustr.clear();
    std::string _ts;
    getline(is,_ts);
    ustr=_ts;
    return is;
}
/**/
#endif
Кто-нибудь, скажите, если что-то лучше сделать иначе.
P.S. Я там конструкторы символов также подправил. Можно делать push_back("ы"); (русские символы в utf-8 переделываются в uchar и спокойно посылаются, проблема лишь не забыть что кавычки двойные). Также сделал ещё конструктор от const char* - можно писать ustring="Русский текст в UTF-8"; - и это будет работать. Вводится спокойно через getline(cin,ustring); и через cin>>ustring; и выводится cout<<ustring; так же как обычные строки.
Yandex
Объявления
05.12.2013, 00:14     Аналог std::string
Ответ Создать тему
Опции темы

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