Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/75: Рейтинг темы: голосов - 75, средняя оценка - 4.63
1 / 1 / 0
Регистрация: 18.05.2018
Сообщений: 16

Создать двумерный динамический массив типа String

19.05.2018, 11:54. Показов 16216. Ответов 29

Студворк — интернет-сервис помощи студентам
Мне нужно создать динамический массив типа string с заранее неизвестной размерностью, которая вводится при запуске программы. После чего массив заполняется случайными символами (у меня взяты - и _). Со статическим у меня проблем нет.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.05.2018, 11:54
Ответы с готовыми решениями:

Как создать и заполнить динамический массив строк типа std::string?
Как создать и заполнить динамический массив строк типа string? Если заполнять массивы через getline(), почему то удаляется первая буква в...

Как создать динамический массив типа string? Как создать класс такого массива?
Как создать динамический массив типа string? Как создать класс такого массива? =-O Помогите, пожалуйста, очень нужна помощь!

Создать динамический двумерный массив типа int. Ввести таблицу из 5x5 чисел. Полсчитать количество положительн
Создать динамический двумерный массив типа int. Ввести таблицу из 5x5 чисел. Полсчитать количество положительных чисел в каждой строке.

29
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
19.05.2018, 12:06
Цитата Сообщение от Luchshbli Посмотреть сообщение
ужно создать динамический массив типа string
C++
1
2
3
int n;
cin >> n;
string* arr = new string[n];
0
12 / 12 / 13
Регистрация: 18.05.2018
Сообщений: 67
19.05.2018, 13:08
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
/*Создание двухмерного динамического массива */
#include <iostream>
#include <string>
#include <ctime>
 
using std::string;
using std::cin;
 
int main(void)
{
 
   int a(0);
   const int b(2);
   string (*p)[b](0);
   
   srand(static_cast<unsigned>(time(0)));
   
   cin >> a;
   
   p = new string[a][b];
   
   for(int i = 0; i < b; i++)
       for(int j = 0; j < b; j++)
          p[i][j] = rand() % 2 ? '-' : '_';
   
  
   delete [] p;
   p = NULL;
   
   return 0;
}
0
1 / 1 / 0
Регистрация: 18.05.2018
Сообщений: 16
19.05.2018, 13:27  [ТС]
Прости, но не объяснишь эти строки?:
int a(0);
const int b(2);
string (*p)[b](0);

мне непонятны круглые скобки в данных строках.

Добавлено через 14 минут
Так, я по-моему немного разобрался. Мне нужно задать не только количество строк, но и столбцов.
0
12 / 12 / 13
Регистрация: 18.05.2018
Сообщений: 67
19.05.2018, 15:03
Код
C++
1
2
3
int a(0);
const int b(2);
string (*p)[b](0);
Эквивалентен
C++
1
2
3
int a = 0;
const int b = 2;
string (*p)[b] = 0;
Переменная "p" - указатель на двухмерный массив.
Примеры :
C++
1
2
int a[3][5];
int (*p)[5] = a;
C++
1
2
char a[5][3][5];
char (*p)[3][5] = a;
0
1 / 1 / 0
Регистрация: 18.05.2018
Сообщений: 16
19.05.2018, 16:27  [ТС]
При попытке создания двумерного динамического массива с успешным запуском программы и вводе числа все ломается и ссылается на следующее
Миниатюры
Создать двумерный динамический массив типа String  
0
12 / 12 / 13
Регистрация: 18.05.2018
Сообщений: 67
19.05.2018, 17:22
Код программы покажи.

Добавлено через 6 минут
Я в коде допустил ошибку.
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
/*Создание двухмерного динамического массива */
#include <iostream>
#include <string>
#include <ctime>
 
using std::string;
using std::cin;
 
int main(void)
{
 
   int a(0);
   const int b(2);
   string (*p)[b](0);
   
   srand(static_cast<unsigned>(time(0)));
   
   cin >> a;
   
   p = new string[a][b];
   // Где "b" должно быть "a"
   for(int i = 0; i < b; i++)
       for(int j = 0; j < b; j++)
          p[i][j] = rand() % 2 ? '-' : '_';
   
  
   delete [] p;
   p = NULL;
   
   return 0;
}
Правильно :
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
/*Создание двухмерного динамического массива */
#include <iostream>
#include <string>
#include <ctime>
 
using std::string;
using std::cin;
 
int main(void)
{
 
   int a(0);
   const int b(2);
   string (*p)[b](0);
   
   srand(static_cast<unsigned>(time(0)));
   
   cin >> a;
   
   if(a <= 0)
     a = 1;
 
   p = new string[a][b];
   
   for(int i = 0; i < a; i++)
       for(int j = 0; j < b; j++)
          p[i][j] = rand() % 2 ? '-' : '_';
   
  
   delete [] p;
   p = NULL;
   
   return 0;
}
Добавлено через 10 минут
Кстати.
При динамическом выделении памяти для многомерного массива, только самый левый индекс массива может быть динамическим.
Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main(void)
{
   int a(3);
   const int b(3), c(2);
 
   int (*p)[3][2] = new int[a][b][c];
 
   // b, c - только константы.
   // a - динамическое.
 
   delete [] p;
   p = 0;
 
   //Не забываем удалять и обнулять указатель.
   return 0;
}
0
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
19.05.2018, 17:31
Лучший ответ Сообщение было отмечено Luchshbli как решение

Решение

KuolFyI, с чего Вы решили, что только самый левый
C++
1
2
3
4
5
6
string **s;
int n=5; // к-во строк
int m=10; // к-во столбцов
s=new string*[n];
for(int i=0;i<n;i++)
   s[i]=new string[m];
0
 Аватар для Herji
299 / 208 / 174
Регистрация: 11.05.2016
Сообщений: 655
19.05.2018, 17:31
Цитата Сообщение от KuolFyI Посмотреть сообщение
При динамическом выделении памяти для многомерного массива, только самый левый индекс массива может быть динамическим.
чта?
0
1 / 1 / 0
Регистрация: 18.05.2018
Сообщений: 16
19.05.2018, 18:44  [ТС]
Не профессионально конечно, но мне пока так нужно. Я пытаюсь еще разобраться с указателями и ссылками.
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
#include <iostream>
#include <conio.h>
#include <string>
#include <iomanip>
#include <ctime>
#include <stdlib.h>
using namespace std;
int k = 0;
int px = 0;
int py = 0;
static const char ar[] = { '-', '-', '-', '_' };
string cc = "-";
int render(int *n, string **map);
void cls();
void find(int *n, string **map);
void exit(); // куча объявлений
 
int main()
{
    int n;
    cin >> n;
    string **map = new string*[n]; //создание карты
    for (int i = 0; i < 2; i++)
        map[i] = new string[n];
    for (int i = 0; i<n; i++)
        for (int j = 0; j<n; j++)
            map[i][j] = ar[rand() % (sizeof(ar))];
    int i = 0;
    map[19][19] = '@';
    while (i == 0) {
        render(&n, map);
        cout << "X " << py + 1 << " Y " << px + 1 << endl;
        k = _getch();
        cls(); // очистка консоли после считывания, чтобы карта не дублировалась 
    }
    for (int i = 0; i<n; i++)
        delete[] map[i];
        return 0;
    }
 
int render(int *n, string **map) { //вывод карты
    find(n, map);
    int lu, hl, hr, ld;
    if (px - 10 < 0) lu = px;
    else lu = 10;
    if (py - 10 < 0) hl = py;
    else hl = 10;
    if (px + 10 > *n) ld = *n - px;
    else ld = 10;
    if (py + 10 > *n) hr = *n - py;
    else hr = 10;
    for (int i = px - lu; i<px + ld; i++)
    {
        for (int j = py - hl; j<py + hr; j++)
            cout << setw(2) << map[i][j];
        cout << endl;
    }
    return 0;
}
 
void cls() { //очистка консоли
    system("cls");
}
 
void find(int *n, string **map) { //поиск ключа на карте
    for (int i = 0; i<*n; i++)
        for (int j = 0; j<*n; j++)
            if (map[i][j] == "@")
            {
                px = i;
                py = j;
            }
}
 
 
 
void exit() { exit(0); }
0
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
19.05.2018, 19:28
Luchshbli, А зачем map имеет тип string, если Вы храните в каждой строке только по одному символу?
И еще надо
C++
1
2
3
    for (int i = 0; i<n; i++)
        delete[] map[i];
    delete[] map;
0
1 / 1 / 0
Регистрация: 18.05.2018
Сообщений: 16
19.05.2018, 19:40  [ТС]
Как по мне не особо имеет значение char или string.
И еще надо(с)
C++
1
2
3
 for (int i = 0; i<n; i++)
        delete[] map[i];
    delete[] map;
У меня есть:
C++
1
2
for (int i = 0; i<n; i++)
        delete[] map[i];
Зачем там еще один delete[] map? Он ведь и так его полностью удаляет. Разве нет?
0
 Аватар для Herji
299 / 208 / 174
Регистрация: 11.05.2016
Сообщений: 655
19.05.2018, 19:52
Цитата Сообщение от Luchshbli Посмотреть сообщение
Разве нет?
нет
0
1 / 1 / 0
Регистрация: 18.05.2018
Сообщений: 16
19.05.2018, 19:58  [ТС]
Я ориентировался на эту статью http://cppstudio.com/post/432/
0
 Аватар для Herji
299 / 208 / 174
Регистрация: 11.05.2016
Сообщений: 655
19.05.2018, 20:06
Цитата Сообщение от Luchshbli Посмотреть сообщение
Я ориентировался на эту статью
C++
1
2
3
4
// удаление двумерного динамического массива
    for (int count = 0; count < 2; count++)
        delete []ptrarray[count];
    system("pause");
Это не полное удаление
0
1 / 1 / 0
Регистрация: 18.05.2018
Сообщений: 16
19.05.2018, 20:07  [ТС]
Нашел проблему... Зачем-то здесь стояла 2, а не n. Наверное, не углядел при редактировании
C++
1
2
for (int i = 0; i < 2; i++)
        map[i] = new string[n];
0
 Аватар для Herji
299 / 208 / 174
Регистрация: 11.05.2016
Сообщений: 655
19.05.2018, 20:08
Не буду расписывать из-за алкоголя в крови, но
Цитата Сообщение от zss Посмотреть сообщение
delete[] map;
по-нормальному нужен.
0
12 / 12 / 13
Регистрация: 18.05.2018
Сообщений: 67
19.05.2018, 20:24
Я прочитал ваш код и понял его.
Я уже видел такие вещи, но это не многомерный массив.
Поясню.
По определению c++ многомерный массив - это массив, у которого более одного индекса(Айвор Хортон - Visual C++ 2010. Полный курс).
В этом коде создаётся указатель на массив указателей, и этот массив указателей заполняется указателями
на какие-то элементы(в этом примере указателями на массив string)
Здесь одномерный массив, хронящий указатели на массивы.
Код B :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
using std::cout;
using std::endl;
 
class A
{
public:
    ~A(void)
    {
        cout << "~A" << endl;
    }
};
 
int main(void)
{
   A (*p)[3] = new A[2][3];
 
   delete [] p;
   p = NULL;
 
   return 0;
}
Код C :
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
#include <iostream>
 
using std::cout;
using std::endl;
 
class A
{
public:
    ~A(void)
    {
        cout << "~A" << endl;
    }
};
 
int main(void)
{
   A **p;
 
   p = 0;
   p = new A*[2];
 
   for(int i = 0; i < 2; i++)
       p[i] = new A[3];
 
   for(int i = 0; i < 2; i++)
       delete [] p[i];
 
   delete [] p;
   p = 0;
 
   return 0;
}
Сравните код B и С.
Первый код двухмерный массив, а второй массив указателей на массивы.
Для доступа к элементам можно использовать p[][];
Если конечные элементы массивов заполнены одинакова, то результат p[][] будут одинаковы в двух кодах,
но в коде C имитация многомерного массива, если смотреть со стороны p[][](Можно использовать в коде B), а использовать p[][] можно по правилам языка в двух кодах.
Если хотите посмотрите в Айвор Хортон - Visual C++ 2010. Полный курс. Тема многомерные массивы и их динамическое создание.
0
 Аватар для Herji
299 / 208 / 174
Регистрация: 11.05.2016
Сообщений: 655
19.05.2018, 21:18
Цитата Сообщение от KuolFyI Посмотреть сообщение
Я прочитал ваш код и понял его.
Я уже видел такие вещи, но это не многомерный массив.
чта? Продемонстрируйте многомерный массив тут.
Цитата Сообщение от KuolFyI Посмотреть сообщение
В этом коде создаётся указатель на массив указателей
и, как по-Вашему, зачем это делается?
Это ли не двумерный массив?

Добавлено через 16 минут
Цитата Сообщение от KuolFyI Посмотреть сообщение
это массив, у которого более одного индекса
смотрите какой трехмерный массив получается
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
    int  ***f = new int**[3];
    for(int i=0; i<3; i++)
    {
        f[i] = new int*[3];
        for(int j=0; j<3; j++)
        {
            f[i][j] = new int[3];
            for(int k = 0; k<3; k++)
            {
                f[i][j][k] = rand()%10;
            }
        }
 
    }
 
    for(int i=0; i<3; i++)
    {
        for(int j=0; j<3; j++)
        {
            for(int k=0; k<3; k++)
            {
                std::cout << f[i][j][k] <<".";
            }
            std::cout << " ";
        }
        std::cout << "\n";
    }
к нему даже по индексам обращаться можно, коих более чем один!
0
1 / 1 / 0
Регистрация: 18.05.2018
Сообщений: 16
19.05.2018, 21:20  [ТС]
Я разобрался. Здесь я, похоже, пропустил при редактировании двойку и не заменил ее на n:
C++
1
2
 for (int i = 0; i < 2; i++)
        map[i] = new string[n];
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.05.2018, 21:20
Помогаю со студенческими работами здесь

двумерный динамический массив типа char
#include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;windows.h&gt; using namespace std; void RussianMessage(const char *str) { ...

Двумерный динамический массив типа char
Как создать двумерный динамический массив типа char, в который будут записываться слова разной длины?

Как создать динамический двумерный массив
Можно ли создать на С++ динамический двухмерный масив? Как? int z , x ; cin &gt;&gt; z ; cin &gt;&gt; x ; int *arr = new int(z); int...

Создать двумерный динамический массив char
Нужно сделать динамический двумерный массив типа char , Надо чтобы было только через char вот так: qwerty root Linux ...

Возможно ли создать двумерный динамический массив?
существует ли возможность создать двумерный динамический массив, к примеру 2х5 ?


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru