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

Выделение динамической памяти C++ - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.94
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
27.11.2012, 01:33     Выделение динамической памяти C++ #1
Всем доброго времени суток. Вот столкнулся с проблемой и пока что не приходит ничего интересного по поводу её решения. есть у меня метод, который выделяет память + 1 в зависимости от введённого размера пользователем, а т.е в классе метод для выделения, а в воде cin с вопросом введите длину строку. например он ввёл размерность 5, метод выделяет ещё + 1 (для \0) а потом вызывается метод ввода строки, если он введёт большее кол-во символов в строке, то вылет. как осуществить проверку? например он ввёл размерность 5, а ввёл 7 и ему выводилось на экран заново cin>> размерность и строка. Вот сам код. Help:

методы:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
String(int i)
    {
        string = new char[i + 1];
    }
    String(char * s)
    {
        strcpy(string, s);
    }
    ~String()
    {
        delete [] string;
    }
    void Initialization()
    {
        cout<<"Введите строку: ";
        gets(string);
        char * buffer;
        buffer = gets(string);
        cout<<endl;
 
        ChoiseShowString();
    }
воид:

C++
1
2
3
4
5
6
7
8
9
10
11
else if(punkt == 2) 
            {
                system("title String произв. размера");
                system("mode con cols=43 lines=30");
                int c;
                cout<<"Введите размер символьного массива: ";
                cin>>c;
                cout<<endl;
                String b(c);
                b.Initialization();
            }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
27.11.2012, 01:47     Выделение динамической памяти C++ #2
owned, вызывай cin.getline и вторым параметром передавай кол-во символов.
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
27.11.2012, 02:21  [ТС]     Выделение динамической памяти C++ #3
Vourhey, покажи на примере, как сделать
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
27.11.2012, 02:25     Выделение динамической памяти C++ #4
C++
1
std::cin.getline(str, count);
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
27.11.2012, 02:43  [ТС]     Выделение динамической памяти C++ #5
Vourhey, помоги плз, а то в такое время уже мозг off. Вот код, 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
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
/*Разработать класс 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 * string;
public:
    String() // По умолчанию.
    {
        string = new char [81]; 
    }
    String(int i) // Позволяет создавать строку произвольного размера.
    {
        string = new char[i + 1];
    }
    String(char * s) // Создание строки и инициализация.
    {
        s = new char[];
        strcpy(string, s);
    }
    ~String()
    {
        delete [] string;
    }
    void Initialization()
    {
        cout<<"Введите строку: ";
        gets(string);
        char * buffer;
        buffer = gets(string);
        cout<<endl;
 
        ChoiseShowString();
    }
    void ChoiseShowString()
    {
        int choiseshowstring;
        cout<<"Показать строку?\n\n"
            <<"1 - Да. \n"
            <<"0 - Выйти.\n\n";
        cout<<"Введите ваш выбор: ";
        cin>>choiseshowstring;
        cout<<endl;
        if(choiseshowstring == 0) exit(0);
        if(choiseshowstring == 1) ShowString();
        else
        {
            system("cls");
            cout<<"Не верный ввод, повторите выбор!\n\n";
            ChoiseShowString();
        }
    }
    void ShowString()
    {
        OemToAnsi(string,string);
        cout<<"Строка: "<<string<<endl<<endl;
    }
};
 
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";
}
 
void 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=43 lines=30");
                int c;
                cout<<"Введите размер символьного массива: ";
                cin>>c;
                cout<<endl;
                String b(c);
                b.Initialization();
            }
            else if(punkt == 3) 
            {
                system("title Создание и инициализация строки");
                system("mode con cols=43 lines=30");
                String str(s);
                str.Initialization();
                getch();
            }
            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);
        }
    }
 
}
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
27.11.2012, 02:51     Выделение динамической памяти C++ #6
owned, я не вижу, где бы ты использовал getline. Если тянет на гетс, то для ограничение ввода можешь использовать fgets. Она тоже принимает параметр на количество.

Добавлено через 1 минуту
owned, если сложно найти ошибку, то вытащи код, который работает неправильно в отдельный модуль и проверь его отдельно. Так тебе будет проще.
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
27.11.2012, 02:53  [ТС]     Выделение динамической памяти C++ #7
Help. * конструктор, который создаёт строку и инициализирует её строкой, полученной от пользователя.
класс должен содержать методы для ввода строк с клавиатуры и вывода строк на экран.

метод в классе:

C++
1
2
3
4
5
String(char * s) // Создание строки и инициализация.
    {
        s = new char[];
        strcpy(string, s);
    }
в воиде:
C++
1
2
3
4
5
6
7
8
else if(punkt == 3) 
            {
                system("title Создание и инициализация строки");
                system("mode con cols=43 lines=30");
                String str(s);
                str.Initialization();
                getch();
            }
что не так?
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
27.11.2012, 02:56     Выделение динамической памяти C++ #8
Цитата Сообщение от owned Посмотреть сообщение
String(char * s) // Создание строки и инициализация. { s = new char[]; strcpy(string, s); }
Зачем здесь вообще s нужна? Что здесь происходит? ))
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,397
27.11.2012, 02:56     Выделение динамической памяти C++ #9
C++
1
2
using namespace std;
char * string;
Крайне не советовал бы.
C++
1
2
3
4
5
String(char * s) // Создание строки и инициализация.
    {
        s = new char[];
        strcpy(string, s);
    }
В задании нужно строку (свойство класса) инициализировать строкой пользователя, а не наоборот.

gets устарел даже для С, зачем его использовать наряду с поточным вводом/выводом?
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
27.11.2012, 03:06  [ТС]     Выделение динамической памяти C++ #10
Цитата Сообщение от Vourhey Посмотреть сообщение
Зачем здесь вообще s нужна? Что здесь происходит? ))
т.к это конструктор с параметрами и он принимает строку. вот полный код. помоги чем сможешь, а т.е по исправляй ошибки, если есть и т.п. буду очень рад. пожалуйста) вот полный код моей шняги:

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
/*Разработать класс 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 * string;
public:
    String() // По умолчанию.
    {
        string = new char [81]; 
    }
    String(int i) // Позволяет создавать строку произвольного размера.
    {
        string = new char[i + 1];
    }
    String(char * s) // Создание строки и инициализация.
    {
        s = new char[];
        strcpy(string, s);
    }
    ~String()
    {
        delete [] string;
    }
    void Initialization()
    {
        cout<<"Введите строку: ";
        gets(string);
        char * buffer;
        buffer = gets(string);
        cout<<endl;
 
        ChoiseShowString();
    }
    void ChoiseShowString()
    {
        int choiseshowstring;
        cout<<"Показать строку?\n\n"
            <<"1 - Да. \n"
            <<"0 - Выйти.\n\n";
        cout<<"Введите ваш выбор: ";
        cin>>choiseshowstring;
        cout<<endl;
        if(choiseshowstring == 0) exit(0);
        if(choiseshowstring == 1) ShowString();
        else
        {
            system("cls");
            cout<<"Не верный ввод, повторите выбор!\n\n";
            ChoiseShowString();
        }
    }
    void ShowString()
    {
        OemToAnsi(string,string);
        cout<<"Строка: "<<string<<endl<<endl;
    }
};
 
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";
}
 
void 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=43 lines=30");
                int c;
                cout<<"Введите размер символьного массива: ";
                cin>>c;
                cout<<endl;
                String b(c);
                b.Initialization();
            }
            else if(punkt == 3) 
            {
                system("title Создание и инициализация строки");
                system("mode con cols=43 lines=30");
                String str(s);
                str.Initialization();
                getch();
            }
            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);
        }
    }
 
}
Добавлено через 1 минуту
MrGluck, а что предложишь? для ввода нормальный строк я использую gets и getline

Добавлено через 28 секунд
сейчас попробую fgets
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
27.11.2012, 03:07     Выделение динамической памяти C++ #11
Цитата Сообщение от owned Посмотреть сообщение
это конструктор с параметрами и он принимает строку.
Я вижу, что это. Я не понимаю, что этот код пытается сделать. А ты объяснить не можешь. Когда ты сможешь объяснить мне, что делает этот код конструктора, ты сам увидишь ошибку. Либо я увижу, что действительно не понял

Добавлено через 27 секунд
Цитата Сообщение от owned Посмотреть сообщение
сейчас попробую fgets
Да нафига тебе сишные вызовы, когда у тебя cin есть?
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
27.11.2012, 03:09  [ТС]     Выделение динамической памяти C++ #12
как я понял - fgets для записи в файл...
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
27.11.2012, 03:10     Выделение динамической памяти C++ #13
Цитата Сообщение от owned Посмотреть сообщение
как я понял - fgets для записи в файл...
Reads characters from stream and stores them as a C string into str until (num-1) characters have been read or either a newline or the end-of-file is reached, whichever happens first.
Где здесь про запись в файл?
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
27.11.2012, 03:10  [ТС]     Выделение динамической памяти C++ #14
Цитата Сообщение от Vourhey Посмотреть сообщение
Я вижу, что это. Я не понимаю, что этот код пытается сделать. А ты объяснить не можешь. Когда ты сможешь объяснить мне, что делает этот код конструктора, ты сам увидишь ошибку. Либо я увижу, что действительно не понял

Добавлено через 27 секунд

Да нафига тебе сишные вызовы, когда у тебя cin есть?
cin'ом можно вводить строки, но если я введу: "Привет мир", то в массив запишется только Привет а то что после пробела - нет
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
27.11.2012, 03:11     Выделение динамической памяти C++ #15
Цитата Сообщение от owned Посмотреть сообщение
cin'ом можно вводить строки, но если я введу: "Привет мир", то в массив запишется только Привет а то что после пробела - нет
Да, блин, потому что getline'ом, читать надо а не через >>.
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
27.11.2012, 03:13  [ТС]     Выделение динамической памяти C++ #16
Цитата Сообщение от Vourhey Посмотреть сообщение
Я вижу, что это. Я не понимаю, что этот код пытается сделать. А ты объяснить не можешь. Когда ты сможешь объяснить мне, что делает этот код конструктора, ты сам увидишь ошибку. Либо я увижу, что действительно не понял
что я хочу сделать? - конструктор, который создаёт строку и инициализирует её строкой, полученной от пользователя. код конструктора выделяет память для этой строки и записывает, то что ввёл пользователь.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
27.11.2012, 03:17     Выделение динамической памяти C++ #17
Цитата Сообщение от owned Посмотреть сообщение
и инициализирует её строкой, полученной от пользователя.
Тогда объясни, зачем тебе выделять память на указателе пришедшем от пользователя? Этот указатель от пользователя. Он уже нас троку какую-то указывать должен. Зачем для него еще new вызывать?
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
27.11.2012, 03:20  [ТС]     Выделение динамической памяти C++ #18
Vourhey, не знаю, я запутался...
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
27.11.2012, 03:22     Выделение динамической памяти C++ #19
Цитата Сообщение от owned Посмотреть сообщение
не знаю
Не знаешь, то зачем писал этот код? Если я не знаю, зачем нужен какой-то код, я его либо сразу не пишу, либо удаляю. Разберись с кодом. Код с неизвестным предназначением - удали.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2012, 03:26     Выделение динамической памяти C++
Еще ссылки по теме:

C++ Выделение динамической памяти
C++ Выделение динамической памяти
Выделение динамической памяти C++

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

Или воспользуйтесь поиском по форуму:
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
27.11.2012, 03:26  [ТС]     Выделение динамической памяти C++ #20
Vourhey, хех, просто помоги) нужен конструктор, который создаёт строку и инициализирует её строкой, полученной от пользователя.
Yandex
Объявления
27.11.2012, 03:26     Выделение динамической памяти C++
Ответ Создать тему
Опции темы

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