С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
1

Класс String

28.11.2012, 05:07. Показов 1548. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет, помогите пожалуйста. Ошибка на этапе выполнения. Скомпилируйте программу, с помощью стрелочек(клавиш) перейдите на 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);
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.11.2012, 05:07
Ответы с готовыми решениями:

Здравствуйте! Создал класс std::string. Не создается объкт типа string... Подскажите в чем причина?
#include &lt;stdlib.h&gt; #include &lt;iostream&gt; #include &lt;string.h&gt; //using namespace std; class...

Реализовать пользовательские типы: класс Person и класс String
1)Разработать класс Person, который содержит соответствующие члены для хранения: имени, ...

Класс String
Написать программу, которая считывает текст из файла и выводит его на экран, меняя местами каждые...

Класс string
Добрый день, друзья. #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int main...

3
Неэпический
18108 / 10695 / 2062
Регистрация: 27.09.2012
Сообщений: 26,928
Записей в блоге: 1
28.11.2012, 05:15 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';
1
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
28.11.2012, 05:27  [ТС] 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, спасибо
0
Неэпический
18108 / 10695 / 2062
Регистрация: 27.09.2012
Сообщений: 26,928
Записей в блоге: 1
28.11.2012, 05:36 4
Цитата Сообщение от owned Посмотреть сообщение
Croessmah, а почему так получается? я например ввёл 10. в цикле I - 1 - а значит будет 9 итераций и элементы массива с 0 до 8 проинициализируются 'A' (проинициализируется 9 элементов)
Все правильно: если вы вводите 10, то у вас 9 символов и завершающий 0, итого 10 символов в строке(сколько и выделили памяти).
Цитата Сообщение от owned Посмотреть сообщение
или что тут поменять, чтобы работало на 5+
Выделяйте на 1 символ больше, либо откажитесь от завершающего символа '\0', но тогда придется переписать класс по другому.
0
28.11.2012, 05:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.11.2012, 05:36
Помогаю со студенческими работами здесь

Класс String
вот файл реализации String::String() //конструктор на 80 { size = 80; str = new char; ...

Класс String
добрый день. У кого-то есть программа которая создаёт класс String – строку, используя динамическую...

класс String
//main #include &lt;iostream&gt; #include &quot;header.h&quot; const int ArSize = 10; const int MaxLen =81;...

класс string
товарищи,пишу лабу,простенькую,в принципе,но почему-то фэйлюсь. в ведённой строке за один просмотр...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru