12 / 7 / 7
Регистрация: 02.04.2014
Сообщений: 342
1

Создать класс работы со строками

11.11.2014, 14:16. Показов 2291. Ответов 5
Метки нет (Все метки)

Необходимо реализовать
-конструктор по умолчанию(создает пустую строку);
-конструктор с параметром char *;
-конструктор копирования;
-деструктор (освобождает выделенную память);
-оператор присваивания;
-оператор приведения к const char *;
- конкатенацию двух строк:операторы + и +=;
-тестовую программу (функцию main,проверяющую все вышеперечисленное);
Написал вот такое:
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
#include <iostream>
class STRING
{
private:
    char *data;
public:
    
    //конструктор по умолчанию
    STRING()
    {
        data=new char[1];
        if (data==NULL)
        {
            std::cout<<"error";
            exit(1);
        }
        data[0]='\0';
    }
    //конструктор с параметром char*
    STRING(char *x)
    {
        int i=0;
             while (x[i]!='\0')
                     {
                       i++;
                     }
        data=new char[i+1];
        if (data==NULL)
           {
            std::cout<<"error";
            exit(1);
            }
        for (int k=0;k<i+1;k++)
            {
            data[k]=x[k];
            }
        data[i+1]='\0';
    }
    //конструктор копирования
    STRING(const STRING &x)
    {
        int i=0;
        while (x.data[i]!='\0')
           {
            i++;
           }
        data=new char[i+1];
        if (data==NULL)
           {
            std::cout<<"error";
            exit(1);
           }
        for (int k=0;k<i+1;k++)
        {
            data[k]=x.data[k];
        }
    }
    //деструктор
    ~STRING(void)
    {
        if (data!=NULL)
            delete[]data;
    }
    //оператор присваивания
    STRING&operator=(const STRING &r)
    {
        if (data!=NULL)
            delete[]data;
        int i=0;
        while (r.data[i]!='\0')
        {
            i++;
        }
        data=new char[i+1];
        if (data==NULL)
        {
        std::cout<<"error";
        exit(1);
        }
        for (int k=0;k<i+1;k++)
        {
            data[k]=r.data[k];
        }
        return *this;
    }
    //оператор приведения к const char*;
    char* PChar(void) const 
     {
    int i=0;
    while (data[i]!='\0')
        {
    i++;
        }
    char* p=new char[i+1];
    if (data==NULL)
           {
            std::cout<<"error";
            exit(1);
           }
    for (int k=0;k<=i+1;k++)
    {
    p[k]=data[k];
    }
    return p;
    }
Наверное где-то накосячил.Подскажите где=)

Добавлено через 9 минут
да С++ это, а не С#.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.11.2014, 14:16
Ответы с готовыми решениями:

Создать класс для работы сo строками
Создать класс для работы сo строками. Разработать элементы класса: a. Поля: * указатель на char...

Создать класс BitString для работы с битовыми строками
Вопрос: если даны строки разной длины, то каким образом выполняются побитовые операции? До старшего...

Создать динамический класс для работы со строками (последовательностями символов)
Добрый день,товарищи. Можете мне объяснить логику задачи на с++. Вот сама задача. Создать...

Создать динамический класс для работы со строками (последовательностями символов)
пишу код для такой задачи :Создать динамический класс для работы со строками (последовательностями...

5
Модератор
Эксперт С++
12118 / 9786 / 5913
Регистрация: 18.12.2011
Сообщений: 26,260
11.11.2014, 14:40 2
37 строка
Цитата Сообщение от sunjan Посмотреть сообщение
data[i+1]='\0';
лишняя.
Ноль Вы уже переписали из x в цикле
1
12 / 7 / 7
Регистрация: 02.04.2014
Сообщений: 342
13.11.2014, 11:12  [ТС] 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
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
#include <iostream>
class STRING
{
private:
    char *data;
public:
    
    //конструктор по умолчанию
    STRING()
    {
        data=new char[1];
        if (data==NULL)
        {
            std::cout<<"error";
            exit(1);
        }
        data[0]='\0';
    }
    //конструктор с параметром char*
    STRING(char *x)
    {
        int i=0;
             while (x[i]!='\0')
                     {
                       i++;
                     }
        data=new char[i+1];
        if (data==NULL)
           {
            std::cout<<"error";
            exit(1);
            }
        for (int k=0;k<i+1;k++)
            {
            data[k]=x[k];
            }
      
    }
    //конструктор копирования
    STRING(const STRING &x)
    {
        int i=0;
        while (x.data[i]!='\0')
           {
            i++;
           }
        data=new char[i+1];
        if (data==NULL)
           {
            std::cout<<"error";
            exit(1);
           }
        for (int k=0;k<i+1;k++)
        {
            data[k]=x.data[k];
        }
    }
    //деструктор
    ~STRING(void)
    {
        if (data!=NULL)
            delete[]data;
    }
    //оператор присваивания
    STRING&operator=(const STRING &r)
    {
        if (data!=NULL)
            delete[]data;
        int i=0;
        while (r.data[i]!='\0')
        {
            i++;
        }
        data=new char[i+1];
        if (data==NULL)
        {
        std::cout<<"error";
        exit(1);
        }
        for (int k=0;k<i+1;k++)
        {
            data[k]=r.data[k];
        }
        return *this;
    }
    //оператор приведения к const char*;
    char* PChar(void) const 
     {
    int i=0;
    while (data[i]!='\0')
        {
    i++;
        }
    char* p=new char[i+1];
    if (data==NULL)
           {
            std::cout<<"error";
            exit(1);
           }
    for (int k=0;k<=i+1;k++)
    {
    p[k]=data[k];
    }
    return p;
    }
Добавлено через 43 секунды
Вот так?Все остальное нормально?=)
0
12 / 7 / 7
Регистрация: 02.04.2014
Сообщений: 342
18.11.2014, 19:49  [ТС] 4
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
#include <iostream>
class STRING
{
private:
    char *data;
public:
    STRING();
STRING(char *x);
STRING(const STRING &x);
~STRING(void){
if (data != NULL)
            delete[] data;};
STRING&operator=(const STRING &r);
char* PChar(void) const ;
STRING operator+(const STRING &r);
STRING operator+=(const STRING &r);
 
 
};
    //конструктор по умолчанию
    STRING::STRING()
    {
        data=new char[1];
        if (data==NULL)
        {
            std::cout<<"error";
            exit(1);
        }
        data[0]='\0';
    }
int main(void)
    {
        STRING str;}
Почему-то в режиме отладки,пишет "ошибка чтения строки".Не подскажите почему?
0
Эксперт PHP
3101 / 2586 / 1219
Регистрация: 14.05.2014
Сообщений: 7,231
Записей в блоге: 1
18.11.2014, 20:05 5
Цитата Сообщение от sunjan Посмотреть сообщение
C++
1
2
3
4
5
int i=0;
while (r.data[i]!='\0')
{
    i++;
}
подобные строки в вашем коде встречаются несколько раз. Я бы оформил в отдельную функцию.
0
12 / 7 / 7
Регистрация: 02.04.2014
Сообщений: 342
18.11.2014, 23:15  [ТС] 6
мне сложно работать
с этими классами,боюсь совсем запутаться еще и с функциями.

Добавлено через 2 часа 17 минут
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
#include <iostream>
class STRING
{
private:
    char *data;
public:
    STRING();
STRING(char *x);
STRING(const STRING &x);
~STRING(void);
STRING&operator=(const STRING &r);
char* PChar(void) const ;
STRING operator+(const STRING &r);
STRING operator+=(const STRING &r);
operator const char*() const
    {
        if (data) return data;}
 
};
    //конструктор по умолчанию
    STRING::STRING()
    {
        data=new char[1];
        if (data==NULL)
        {
            std::cout<<"error";
            exit(1);
        }
        data[0]='\0';
    }
    //конструктор с параметром char*
    STRING::STRING(char *x)
    {
        int i=0,k=0;
             while (x[i]!='\0')
                     {
                       i++;
                     }
        data=new char[i+1];
        
        for (int k=0;k<i+1;k++)
            {
            data[k]=x[k];
            }
    };
    //конструктор копирования
    STRING::STRING(const STRING &x)
    {
        int k=0,i=0;
        while (x.data[i]!='\0')
           {
            i++;
           }
        data=new char[i+1];
        
        for (int k=0;k<i+1;k++)
        {
            data[k]=x.data[k];
        }
    }
    //деструктор
    STRING::~STRING(void)
    {
            delete[]data;
    }
    //оператор присваивания
    
STRING & STRING:: operator=(const STRING &r){
    int i = 0;
    int j;
    if (this == &r){ 
        return *this; 
    };
 
    while (r.data[i] != '\0')
        i++;
 
    
        delete[] this->data;
 
 
    this->data = new char[i + 1];
    if (this->data == NULL){
        std::cout << "error";
        exit(1);
    }
    for (j = 0; j != i + 1; j++){
        this->data[j] = r.data[j];
    }
    return *this;
}
    //оператор приведения к const char*;
    
    
 
STRING::STRING operator+(const STRING &r)
{
    STRING tmp;
    int i=0,l=0;
    while (r.data[i]!='\0')
    {
        i++;
    }
    tmp.data=new char[i+l+1];
    
    for (int k=0;k<i;k++)
    {
        tmp.data[k]=data[k];
    }
    for (int n=0;n<=l;n++)
    {
        tmp.data[n+1]=r.data[n];
    }
    tmp.data[i+l+1]='\0';
    return tmp;
}
//конкатенация с изменением
STRING::STRING operator+=(const STRING &r)
{
    int i=0;int l=0;
    while (r.data[i]!='\0')
    {
        i++;
    }
    while (data[i]!='\0')
    {
        i++;
    }
    char *tmp=new char [i+l+1];
    if  (tmp==NULL)
    {
        std::cout<<"error";
        exit(1);
    }
    for (int k=0;k<i;k++)
    {
        tmp[k]=data[k];
    }
    for (int n=0;n<=l;n++)
    {
        tmp[n+1]=r.data[n];
    }
    tmp[i+l+1]='\0';
    delete[]data;
    int s=0;
    while (data[s]!='\0')
    {
        data[s]=tmp[s];
        s++;
    }
    return data;
};
 
 
    int main(void)
    {
        STRING str;
        STRING st("fdr"); 
        STRING s("ghf");
        STRING t=s;
        st.operator+(t);
        st.operator+=(t);
        return 0;
    }
В конце почему-то много ошибок выдает..не могу разобраться=(
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.11.2014, 23:15
Помогаю со студенческими работами здесь

Создать динамический класс для работы со строками. Перегрузка строкового класса
Форумчане, помогите пожалуйста с задачей. Никак не пойму как перегрузить часть операторов. Вот...

Реализовать класс для работы со строками
Пожалуйста помогите с заданием Необходимо реализовать класс TString. В процессе выполнения...

Класс для работы со строками CString
Написать текстовый редактор с параметрами 1. Вставка в начало 2. Копирование строк 3. Поиск в...

Разработать класс String для работы со строками
разработать класс String для работы со строками. Класс должен содержать контср по умолчанию,...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru