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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Символьные массивы http://www.cyberforum.ru/cpp-beginners/thread1024616.html
Написать и отладить программу для ввода предложения, содержащего несколько круглых скобок. Если число открывающихся скобок равно числу закрывающихся, то вывести на экран соответствующее сообщение, в противном случае – вывести номер позиции, где расположена первая ошибочная закрывающая скобка. Напишите хотя бы, как должна выглядеть программа на borland 3.1
C++ фантастики с ifstream.open там написано "When using std::string to hold the filename, you must use .c_str() before passing it to this constructor." но у меня string textToString( string fileName ) { string out; ifstream inputFile; inputFile.open(fileName);} работает ...но открыл другой файл, где такая же конструкция не работала, и в первом случае перестало работать, не меняя исходника, Что за... http://www.cyberforum.ru/cpp-beginners/thread1024612.html
C++ Классы. Перегрузка операторов для комплексного числа
На основе вот этой темы: http://www.cyberforum.ru/cpp-beginners/thread1010206.html (к сожалению более вразумительного примера я не нашёл),начал писать свою программу: // Создайте класс Complex (комплексное число) в алгебраической форме z = x + i * y , // включающего два поля класса: действительную часть (x) и мнимую часть (y) числа. // Реализовать методы вычисления модуля комплексного числа,...
C++ Программисты сделайте задание если не трудно пожалуйста! :D
Hайти минимум функции У=cos(x), при изменении x от 0 до 1 с шагом тт/8
C++ C++ с чего начать? http://www.cyberforum.ru/cpp-beginners/thread1024603.html
Здравствуйте, подскажите, пожалуйста, есть ли смысл сначала изучить С, а потом перейти к С++. Или сразу лучше изучать С++? Спасибо!!!
C++ IDE с автосозданием и измененим реализации класса Есть ли IDE, которые представляют возможность для классов: //some.h class Some { private: int x, y, z; public: Some(); Some(int); void doSomething(); подробнее

Показать сообщение отдельно
k1-801
 Аватар для k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
05.12.2013, 00:14  [ТС]     Аналог std::string
Цитата Сообщение от 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; так же как обычные строки.
 
Текущее время: 12:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru