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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.90
ton4ik
2 / 2 / 0
Регистрация: 14.10.2009
Сообщений: 28
#1

Массив строк, выделение памяти - C++

12.05.2010, 17:31. Просмотров 2738. Ответов 11
Метки нет (Все метки)

Здравствуйте!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <CONIO.H>
#include <IOSTREAM.H>
 
void main()
{
char *val[32];      int n;
cout<<"n?"; cin>>n;
val=new char*[n];
for (int i=0;i<n;i++)
val[i]=new char[32];
for (int i=0;i<n;i++)
 {cout<<"Input: ";
 cin.get(); cin.getline(val[i],32); }
 for (int i=0;i<n;i++)
 cout<<val[i][32];
getch();
}
Как правильно память под это выделить?
выводит какбе не то что надо и я думаю это потому что я память неправильно выделяю
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2010, 17:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Массив строк, выделение памяти (C++):

Выделение памяти под массив строк - C++
Вот нерабочий код и сейчас объясню, что пытаюсь сделать fstream f; f.open(&quot;in.txt&quot;, ios::in); int i=0, j=0; char...

Выделение памяти под массив - C++
Требуется выделить память под матрицу. Будет ли следующий код работать корректно? //глобальная область int x_size = 3; ...

Выделение памяти под массив - C++
в массиве данных хранять в последовательных ячейках памяти В программе, выделенна память под массив, для ввода данных пользователем. ...

Выделение памяти под массив структур - C++
Возникла проблема в том что не могу никак эфективно реализовать выделение памяти под массив структур, более того: единожды выделив память я...

Выделение памяти под двумерный массив С++ - C++
Гуру С++, подскажите новичку, как обратиться к элементу при следующем выделении памяти? 1)double **matr = new double * 2)double *matr...

Статический массив - динамическое выделение памяти!? - C++
int n; cin &gt;&gt; n; int wtf; почему данная конструкция правильно работает? Это же статический массив?! или при...

11
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
12.05.2010, 17:35 #2
char *val[32]; //поменяй на char**val;

Добавлено через 17 секунд
Память освободить не забудь.
0
ton4ik
2 / 2 / 0
Регистрация: 14.10.2009
Сообщений: 28
12.05.2010, 17:38  [ТС] #3
а всеравно тогда, при выводе пишет не то что вводили
0
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
12.05.2010, 18:01 #4
Это не вывод:
C++
1
2
for (int i=0;i<n;i++)
 cout<<val[i][32];
Вот тебе вывод:
C++
1
2
3
4
5
for (int i=0;i<n;i++){
   for(int j = 0 ; J <32; j++)  cout<<val[i][j];
   cout<<'\n';
}
cout<<'\n';
Добавлено через 1 минуту
А можно еще проще:
C++
1
2
for (int i=0;i<n;i++) cout<<val[i]<<'\n';
cout<<'\n';
1
ton4ik
2 / 2 / 0
Регистрация: 14.10.2009
Сообщений: 28
12.05.2010, 18:08  [ТС] #5
Спасибо! а вот под char *val[32]; это как память выделить правильно?
0
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
12.05.2010, 18:11 #6
char *val[32] ;
Здесь у тебя известно что будет 32 строки, поэтому тебе память нужно выделять
только под строки.
C++
1
for (int i=0;i<32;i++)val[i]=new char[Размер строки];
1
Crudelis
Шаровик затейник
674 / 416 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
12.05.2010, 18:16 #7
необходимо просто сделать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <CONIO.H>
#include <IOSTREAM.H>
 
void main()
{
int n;
cout<<"n?"; 
cin>>n;
char **val=new char *[n];
for (int i=0;i<n;i++)
val[i]=new char[32];
for (int i=0;i<n;i++)
 {
     cout<<"Input: ";
 cin.get(); cin.getline(val[i][32]);
}
 for (int i=0;i<n;i++)
 cout<<val[i][32];
 
delete [] val;
}
1
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
12.05.2010, 18:24 #8
Crudelis:
Утечка памяти ты освободил память только из под указателей на строки, а сами строки остались.

Надо было так:
C++
1
2
for( int i = 0 ; i < n ; i++)delete[]val[i];
delete[]val;
Из - за одной ошибочной книжки я то же думал как ты,
но хорошо есть диспетчер задач и все проверяется,
1
ton4ik
2 / 2 / 0
Регистрация: 14.10.2009
Сообщений: 28
12.05.2010, 18:25  [ТС] #9
ну с этим разобрался)
а вот почему здесь он вводит не как надо7
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
void write_value(int m, char* val[32], char* key[32])
{
 
for (int i=0;i<n;i++)
{ key[i]=new char[32];
  val[i]=new char[32]; }
cin.get();
for (int i=0;i<m;i++)
 { cin.getline(key[i],32);
   cin.getline(val[i],32); }
}
void out_value(int m, char* val[32], char* key[32])
{
for (int i=0;i<m;i++)
 { cout<<"{"<<key[i]<<", "<<val[i]<<"}";
   cout<<endl; }
}
void main( )
{
int k,n,m;
char* val[32], key;
cout<<rus("Г‡Г*ïîëГ*ГҐГ*ГЁГҐ ñâîéñòâ ïîóìîë÷Г*Г*ГЁГѕ")<<endl;
cout<<rus("Ïðèìåð: {Name, txtBook}")<<endl<<endl;
write_value (m,val,key);
out_value (m,val,key);
getch();
}
0
Crudelis
Шаровик затейник
674 / 416 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
12.05.2010, 18:30 #10
Genius Ignat, точно, спасибо что заметил я просто забыл удалить строки
0
ton4ik
2 / 2 / 0
Регистрация: 14.10.2009
Сообщений: 28
12.05.2010, 20:35  [ТС] #11
а и еще при вызове функций в маине:
C++
1
2
write_value (m,val,key);
out_value (m,val,key);
пишет:
[C++ Error] Unit1.cpp(41): E2034 Cannot convert 'char *' to 'char * *'
[C++ Error] Unit1.cpp(41): E2342 Type mismatch in parameter 'key' (wanted 'char * *', got 'char *')

Добавлено через 1 час 39 минут
а ошибка была в этом:
C++
1
char* val[32], key;
а надо было:
C++
1
char* val[32]; char* key[32];
1
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
12.05.2010, 20:41 #12
Маладца сам разобрался.
0
12.05.2010, 20:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2010, 20:41
Привет! Вот еще темы с ответами:

Выделение памяти под двумерный массив - C++
Нужна прога на с++,в которой бы выделялась память для двумерного массива N строк такого вида,как на рисунке&gt;&gt;&gt; За ранее спасибо:)

Выделение памяти под массив объектов - C++
У меня есть класс Shape. Требуется выделить память под массив этих объектов. К примеру: *Shape **shapes; *shapes = new Shape; После...

Выделение памяти под шаблонный массив - C++
template &lt;class T&gt; T* arrray &lt;T&gt;::create (unsigned size) { //..... T* templateBuf = new T ; for (unsigned index = 0;...

Выделение памяти под статический массив - C++
меня тут заинтересовали строки std::string, никто не обращал внимания что в отладчике (ну хз конечно у кого как, но у меня в msvs pro 2013...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru