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

Класс String - C++

Восстановить пароль Регистрация
 
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
28.11.2012, 05:07     Класс String #1
Всем привет, помогите пожалуйста. Ошибка на этапе выполнения. Скомпилируйте программу, с помощью стрелочек(клавиш) перейдите на 2 пункт меню - "Произвольная строка", зайдите в него нажатием ENTER, когда находитесь на нём, потом вводите размерность, на сколько хотите создать массив, ENTER, потом в консоле распечатывается этот массив (сколько вы ввели размерность), он заполнен символом 'A' и потом ошибка на этапе выполнения. Вот код, жду вашей помощи, желательно по скорее, заранее благодарю!:

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
209
210
211
212
213
/*Разработать класс String, который в дальнейшем будет использоваться для работы со строками.
Класс должен содержать: 
* конструктор по умолчанию, позволяющий создать строку длиной 80 символов; 
* конструктор, позволяющий создавать строку произвольного размера; 
* конструктор, который создаёт строку и инициализирует её строкой, полученной от пользователя. 
класс должен содержать методы для ввода строк с клавиатуры и вывода строк на экран.*/
 
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <string.h>
#include <windows.h>
using namespace std;
 
HANDLE H = GetStdHandle(STD_OUTPUT_HANDLE);
 
class String
{
private:
    char * STR;
public:
    String()
    {
        STR = new char [80]; 
    }
    String(int I)
    {
        if(I < 2){I = 10;}
        STR = new char[I];
        cout<<"Успешно выделена память под массив из "<<I<<" элементов!\n\n";
        for(int i = 0; i < I - 1; i++)
        {
            STR[i] = 'A';
        }
        STR[I] = '\0';
    }
    String(int csize, char * s)
    {
        STR = new char[csize];
        strcpy(STR, s);
        OemToAnsi(STR,STR);
    }
    void Show()
    {
        cout<<"Строка: "<<STR<<endl<<endl;
    }
    void Input()
    {
        strcpy(STR, "\0");
        cout<<"Введите строку: ";
        gets(STR);
        system("cls");
        OemToAnsi(STR,STR);
    }
    ~String()
    {
        if(STR)
        {
            cout<<"Деструктор успешно отработал!\n\n";
            cout<<"Массив символов: \""<<STR<<"\" успешно удалён!\n\n";
            delete [] STR;
        }
    }
};
 
void Stand(int x, int y, int key, char*str)
{
    CONSOLE_CURSOR_INFO ci; ci.bVisible=0; ci.dwSize=100; SetConsoleCursorInfo(H,&ci);
    COORD c;
    c.X = x; c.Y = y;
    SetConsoleCursorPosition(H,c);
    SetConsoleTextAttribute(H,key);
    cout<<str<<"\n";
}
 
int main()
{
    system("mode con cols=30 lines=10");
    system("title String");
    setlocale(LC_ALL,"RUS");
 
    String s;
 
    Stand(5,1,10,"FAQ о задании \"String\"");
    Stand(5,3,2,"Произвольная строка");
    Stand(5,5,2,"Создать строку");
    Stand(5,7,2,"Выход");
 
    int key; 
    int punkt = 1;
 
    while(1)
    {
        key = getch();
        if(key == 80)
        {
            if(punkt < 4)
            {
                punkt++;
                if(punkt == 2)
                {
                    Stand(5,1,2,"FAQ о задании \"String\"");
                    Stand(5,3,10,"Произвольная строка");
                }
                else if(punkt == 3)
                {
                    Stand(5,3,2,"Произвольная строка");
                    Stand(5,5,10,"Создать строку");
                }
                else if(punkt == 4)
                {
                    Stand(5,5,2,"Создать строку");
                    Stand(5,7,10,"Выход");
                }
            }
        }
        else if(key == 72)
        {
            if(punkt > 1)
            {
                punkt--;
                if(punkt == 3)
                {
                    Stand(5,5,10,"Создать строку");
                    Stand(5,7,2,"Выход");
                }
                else if(punkt == 2)
                {
                    Stand(5,3,10,"Произвольная строка");
                    Stand(5,5,2,"Создать строку");
                }
                else if(punkt == 1)
                {
                    Stand(5,1,10,"FAQ о задании \"String\"");
                    Stand(5,3,2,"Произвольная строка");
                }
            }
        }
        else if(key == 13)
        {
            system("cls");
            SetConsoleTextAttribute(H,15);
            if(punkt == 1)
            {
                system("title FAQ о задании \"String\"");
                system("mode con cols=43 lines=23");
                SetConsoleTextAttribute(H,10);
                cout<<"\n  Разработать класс String, который в \n  дальнейшем будет использоваться для \n\t работы со строками.\n\n";
                SetConsoleTextAttribute(H,14);
                cout<<"\tКласс должен содержать:\n\n";
                SetConsoleTextAttribute(H,15);
                cout<<" - конструктор по умолчанию, позволяющий \n   создать строку длиной 80 символов.\n\n"
                    <<"      - конструктор, позволяющий \n  создавать строку произвольного размера.\n\n"
                    <<"  - конструктор, который создаёт строку и \n  инициализирует её строкой, полученной от \t\tпользователя.\n\n"
                    <<"   - методы для ввода строк с клавиатуры \n        и вывода строк на экран.\n\n";
                SetConsoleTextAttribute(H,11);
            }
            else if(punkt == 2) 
            {
                system("title String произв. размера");
                system("mode con cols=55 lines=30");
                int size;
                cout<<"Под какое кол-во элементов выделить память? ";
                cin>>size;
                system("cls");
                String obj(size);
                obj.Show();
            }
            else if(punkt == 3) 
            {
                system("title Создание и инициализация строки");
                system("mode con cols=55 lines=30");
                String A(200, " ");
                A.Input();
                int choise;
                cout<<"Строка успешно записана в массив!\n\n";
                cout<<"Вывести строку на экран?\n\n"
                    <<"1. Да\n"
                    <<"2. Нет, выйти.\n";
                cin>>choise;
                if(choise==1)
                {
                    system("cls");
                    A.Show();
                }
                else if(choise==2){exit(0);}
                else
                {
                    system("cls");
                    cout<<"Ошибочный ввод, до свидания!!!\n\n";
                }
            }
            else if(punkt == 4)
            {
                DWORD size=1024;
                char buf[1024];
                GetUserNameA(buf, &size); 
                SetConsoleTextAttribute(H,11);
                system("mode con cols=30 lines=6");
                SetConsoleTextAttribute(H,14);
                system("title До свидания!");
                cout<<"   До свидания ув. "<<buf<<endl<<endl<<"   ";
                SetConsoleTextAttribute(H,11);
            }
            else 
            {
                cout<<"До свидания!\n\n";
                getch();
            }
            exit(0);
        }
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2012, 05:07     Класс String
Посмотрите здесь:

Класс Person. Класс String C++
доработать класс String C++
C++ класс string
Класс String C++
Класс <string> C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
28.11.2012, 05:15     Класс String #2
Конструктор:
C++
1
2
3
4
5
6
7
8
9
10
11
    String(int I)
    {
        if(I < 2){I = 10;}
        STR = new char[I];
        cout<<"Успешно выделена память под массив из "<<I<<" элементов!\n\n";
        for(int i = 0; i < I - 1; i++)
        {
            STR[i] = 'A';
        }
        STR[I] = '\0';
    }
здесь выход за пределы массива:
C++
1
STR[I] = '\0';
поменяйте на
C++
1
STR[I-1] = '\0';
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
28.11.2012, 05:27  [ТС]     Класс String #3
Croessmah, а почему так получается? я например ввёл 10. в цикле I - 1 - а значит будет 9 итераций и элементы массива с 0 до 8 проинициализируются 'A' (проинициализируется 9 элементов). потом STR[I] = '\0'; в последнюю ячейку записываем '\0'. Я немного запутался, как это сделать другим способом? или что тут поменять, чтобы работало на 5+ ? заранее спасибо, просто целый день учёба.. и сейчас мозги не фурычат

Добавлено через 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
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
209
210
211
212
213
214
/*Разработать класс String, который в дальнейшем будет использоваться для работы со строками.
Класс должен содержать: 
* конструктор по умолчанию, позволяющий создать строку длиной 80 символов; 
* конструктор, позволяющий создавать строку произвольного размера; 
* конструктор, который создаёт строку и инициализирует её строкой, полученной от пользователя. 
класс должен содержать методы для ввода строк с клавиатуры и вывода строк на экран.*/
 
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <string.h>
#include <windows.h>
using namespace std;
 
HANDLE H = GetStdHandle(STD_OUTPUT_HANDLE);
 
class String
{
private:
    char * STR;
public:
    String()
    {
        STR = new char [80]; 
    }
    String(int I)
    {
        if(I < 2){I = 10;}
        STR = new char[I];
        cout<<"Успешно выделена память под массив из "<<I<<" элементов!\n\n";
        for(int i = 0; i < I - 1; i++)
        {
            STR[i] = 'A';
        }
        STR[I-1] = '\0';
    }
    String(int csize, char * s)
    {
        STR = new char[csize];
        strcpy(STR, s);
        OemToAnsi(STR,STR);
    }
    void Show()
    {
        cout<<"Строка: "<<STR<<endl<<endl;
    }
    void Input()
    {
        strcpy(STR, "\0");
        cout<<"Введите строку: ";
        gets(STR);
        system("cls");
        OemToAnsi(STR,STR);
    }
    ~String()
    {
        if(STR)
        {
            cout<<"Деструктор успешно отработал!\n\n";
            cout<<"Массив символов: \""<<STR<<"\" успешно удалён!\n\n";
            delete [] STR;
        }
    }
};
 
void Stand(int x, int y, int key, char*str)
{
    CONSOLE_CURSOR_INFO ci; ci.bVisible=0; ci.dwSize=100; SetConsoleCursorInfo(H,&ci);
    COORD c;
    c.X = x; c.Y = y;
    SetConsoleCursorPosition(H,c);
    SetConsoleTextAttribute(H,key);
    cout<<str<<"\n";
}
 
int main()
{
    system("mode con cols=30 lines=10");
    system("title String");
    setlocale(LC_ALL,"RUS");
 
    String s;
 
    Stand(5,1,10,"FAQ о задании \"String\"");
    Stand(5,3,2,"Произвольная строка");
    Stand(5,5,2,"Создать строку");
    Stand(5,7,2,"Выход");
 
    int key; 
    int punkt = 1;
 
    while(1)
    {
        key = getch();
        if(key == 80)
        {
            if(punkt < 4)
            {
                punkt++;
                if(punkt == 2)
                {
                    Stand(5,1,2,"FAQ о задании \"String\"");
                    Stand(5,3,10,"Произвольная строка");
                }
                else if(punkt == 3)
                {
                    Stand(5,3,2,"Произвольная строка");
                    Stand(5,5,10,"Создать строку");
                }
                else if(punkt == 4)
                {
                    Stand(5,5,2,"Создать строку");
                    Stand(5,7,10,"Выход");
                }
            }
        }
        else if(key == 72)
        {
            if(punkt > 1)
            {
                punkt--;
                if(punkt == 3)
                {
                    Stand(5,5,10,"Создать строку");
                    Stand(5,7,2,"Выход");
                }
                else if(punkt == 2)
                {
                    Stand(5,3,10,"Произвольная строка");
                    Stand(5,5,2,"Создать строку");
                }
                else if(punkt == 1)
                {
                    Stand(5,1,10,"FAQ о задании \"String\"");
                    Stand(5,3,2,"Произвольная строка");
                }
            }
        }
        else if(key == 13)
        {
            system("cls");
            SetConsoleTextAttribute(H,15);
            if(punkt == 1)
            {
                system("title FAQ о задании \"String\"");
                system("mode con cols=43 lines=23");
                SetConsoleTextAttribute(H,10);
                cout<<"\n  Разработать класс String, который в \n  дальнейшем будет использоваться для \n\t работы со строками.\n\n";
                SetConsoleTextAttribute(H,14);
                cout<<"\tКласс должен содержать:\n\n";
                SetConsoleTextAttribute(H,15);
                cout<<" - конструктор по умолчанию, позволяющий \n   создать строку длиной 80 символов.\n\n"
                    <<"      - конструктор, позволяющий \n  создавать строку произвольного размера.\n\n"
                    <<"  - конструктор, который создаёт строку и \n  инициализирует её строкой, полученной от \t\tпользователя.\n\n"
                    <<"   - методы для ввода строк с клавиатуры \n        и вывода строк на экран.\n\n";
                SetConsoleTextAttribute(H,11);
            }
            else if(punkt == 2) 
            {
                system("title String произв. размера");
                system("mode con cols=55 lines=30");
                int size;
                cout<<"Под какое кол-во элементов выделить память? "
                    <<"                                            Включая \'\\0\'\n";
                cin>>size;
                system("cls");
                String obj(size);
                obj.Show();
            }
            else if(punkt == 3) 
            {
                system("title Создание и инициализация строки");
                system("mode con cols=55 lines=30");
                String A(200, " ");
                A.Input();
                int choise;
                cout<<"Строка успешно записана в массив!\n\n";
                cout<<"Вывести строку на экран?\n\n"
                    <<"1. Да\n"
                    <<"2. Нет, выйти.\n";
                cin>>choise;
                if(choise==1)
                {
                    system("cls");
                    A.Show();
                }
                else if(choise==2){exit(0);}
                else
                {
                    system("cls");
                    cout<<"Ошибочный ввод, до свидания!!!\n\n";
                }
            }
            else if(punkt == 4)
            {
                DWORD size=1024;
                char buf[1024];
                GetUserNameA(buf, &size); 
                SetConsoleTextAttribute(H,11);
                system("mode con cols=30 lines=6");
                SetConsoleTextAttribute(H,14);
                system("title До свидания!");
                cout<<"   До свидания ув. "<<buf<<endl<<endl<<"   ";
                SetConsoleTextAttribute(H,11);
            }
            else 
            {
                cout<<"До свидания!\n\n";
                getch();
            }
            exit(0);
        }
    }
}
Добавлено через 21 секунду
Croessmah, спасибо
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
28.11.2012, 05:36     Класс String #4
Цитата Сообщение от owned Посмотреть сообщение
Croessmah, а почему так получается? я например ввёл 10. в цикле I - 1 - а значит будет 9 итераций и элементы массива с 0 до 8 проинициализируются 'A' (проинициализируется 9 элементов)
Все правильно: если вы вводите 10, то у вас 9 символов и завершающий 0, итого 10 символов в строке(сколько и выделили памяти).
Цитата Сообщение от owned Посмотреть сообщение
или что тут поменять, чтобы работало на 5+
Выделяйте на 1 символ больше, либо откажитесь от завершающего символа '\0', но тогда придется переписать класс по другому.
Yandex
Объявления
28.11.2012, 05:36     Класс String
Ответ Создать тему
Опции темы

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