Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/34: Рейтинг темы: голосов - 34, средняя оценка - 4.62
8 / 8 / 2
Регистрация: 08.07.2016
Сообщений: 157

Заполнить двумерный динамический массив

25.12.2017, 00:40. Показов 6396. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Как как заполнить двумерный динамический массив с консоли? даны 18 таких строк:

imcv x eo gbgrxctacxnmb l qfncurtgnudv gd pfmz mbyb o
bsqvo nwydzky vj keyuegpglw zz rfusyrqgoqv wspr

но у меня закрывается программа, когда я их в консоль копирую
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
int main(){
    setlocale(LC_CTYPE, "rus");
    int str;
    cout<<"Укажите количество строк: "; cin>>str;
    
    char **arrLines = new char *[str];
    for(int i = 0; i < str; i++) arrLines[i] = new char[15];
    
    cout<<"\nВведите строки: \n";
    for(int i = 0;i < str; i++){
        for(int j = 0;j < 15; j++){
            cin>>arrLines[i][j];
        }
    }
}
вроде проблема в 14 строке, но не знаю как правильно сделать

Добавлено через 18 часов 26 минут
если кто то может помочь, все еще жду ответа

Добавлено через 7 часов 19 минут
если написать
C++
1
2
3
    for(int i = 0;i < str; i++){
        gets(arrLines[i]);
    }
то получается скопировать в консоль, но при нажатии enter происходит ошибка и программа закрывается. это из за выхода за пределы массива? динамический же вроде как удлиняется по мере надобности? или нет?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.12.2017, 00:40
Ответы с готовыми решениями:

Заполнить динамический двумерный массив
Заполнить динамический двумерный массив рандомными числами от 5 до 15. И сделать рандомными строки от 1 до 50. Добавлено через 15...

Как заполнить двумерный динамический массив?
вот я создал двумерный динамический массив (правильно надеюсь): int row=2; for (int i=0; i&lt;dl; i++){if ('!'==str){row+=1;}}; int...

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

17
93 / 91 / 62
Регистрация: 23.11.2013
Сообщений: 242
25.12.2017, 00:52
Цитата Сообщение от Kamila11 Посмотреть сообщение
скопировать в консоль
Что вы имеете ввиду под этими словами? Вручную ввести с клавиатуры точно букву в букву, или что-то из серии ctrl-c ctrl-v?
Цитата Сообщение от Kamila11 Посмотреть сообщение
C++
1
2
3
4
5
for(int i = 0;i < str; i++){
    for(int j = 0;j < 15; j++){
        cin>>arrLines[i][j];
    }
}
И зачем вы пытаетесь вводить отдельно каждый символ, используйте просто ввод по строкам:
C++
1
2
for (int i = 0;i < str; i++)
    cin >> arrLines[i];
Цитата Сообщение от Kamila11 Посмотреть сообщение
динамический же вроде как удлиняется по мере надобности? или нет?
Нет, нужно освобождать, а потом заново перевыделять на нужный размер, но у вас в любом случае памяти выделено на длину строки максимум в 14 символов (+ нуль-символ)
1
8 / 8 / 2
Регистрация: 08.07.2016
Сообщений: 157
25.12.2017, 01:19  [ТС]
Lambont, да, скопировать это ctrl-c ctrl-v.
а как нужно освобождать и заново выделять на нужный размер? как правильно написать? помогите пожалуйста, я только только начала осваивать эту тему и сутки гугления не дали результатов
0
93 / 91 / 62
Регистрация: 23.11.2013
Сообщений: 242
25.12.2017, 01:50
Цитата Сообщение от Kamila11 Посмотреть сообщение
если написать
C++
1
2
3
for(int i = 0;i < str; i++){
    gets(arrLines[i]);
 }
Функция gets считывает целиком строку до символа новой строки '\n', поэтому в массив она пытается запихнуть целиком все строки, а не по отдельности, используйте cin, как я и писал, он считывает до пробела:
C++
1
2
for (int i = 0;i < str; i++)
    cin >> arrLines[i];
1
8 / 8 / 2
Регистрация: 08.07.2016
Сообщений: 157
25.12.2017, 01:58  [ТС]
Lambont, ок, сделала так:
C++
1
2
3
4
5
6
7
char **arrLines = new char *[str];
    for(int i = 0; i < str; i++) arrLines[i] = new char[200];
    
    cout<<"\nВведите строки: \n";
    for(int i = 0;i < str; i++){
            cin>>arrLines[i];
    }
но при копировании консоль опять закрывается(
все строки разной длины, что делать в таком случае?
0
93 / 91 / 62
Регистрация: 23.11.2013
Сообщений: 242
25.12.2017, 03:09
Kamila11,
но при копировании консоль опять закрывается(
Закрывается с ошибкой? Если да, то странно, так как даже при максимальной длине в 14 символов все данные строки должны подходить.
Ну а если вы имеете ввиду что программа просто завершает работу после копирования и ввода всех строк, то ничего удивительного в этом нет, так как программа после заполнения двумерного массива ничего не выполняет и соответственно завершает свою работу.
все строки разной длины, что делать в таком случае?
А ничего, главное чтобы длина подходила под "длину" выделенной памяти
1
8 / 8 / 2
Регистрация: 08.07.2016
Сообщений: 157
25.12.2017, 03:26  [ТС]
Lambont, да, закрывается с ошибкой.
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>
#include <cstdio>
using namespace std;
 
int main(){
    setlocale(LC_CTYPE, "rus");
    int str;
    cout<<"Укажите количество строк: "; cin>>str;
    
    char **arrLines = new char *[str];
    for(int i = 0; i < str; i++) arrLines[i] = new char[200];
    
    cout<<"\nВведите строки: \n";
    for(int i = 0;i < str; i++){
            cin>>arrLines[i];
        //gets(arrLines[i]);
    }
    
    for(int i = 0; i < str; i++){
        for(int j = 0 ; j < 200; j++)
        cout<<arrLines[i][j];
    }
}
может дело в том что cin читает до пробела?
0
93 / 91 / 62
Регистрация: 23.11.2013
Сообщений: 242
25.12.2017, 04:40
Kamila11, cin может считывать и до пробела и до '\n', но нам и нужно до пробела, так как скопированные строки поток будет разделять по пробелам.
Хммм... А если
C++
1
2
3
4
    for(int i = 0; i < str; i++){
        for(int j = 0 ; j < 200; j++)
        cout<<arrLines[i][j];
    }
Заменить на
C++
1
2
    for(int i = 0; i < str; i++)
        cout << arrLines[i];
И добавьте ещё в конце функции main:
C++
1
2
3
for(int i = 0; i < str; i++)
    delete[] arrLines[i];
delete[] arrLines;
1
71 / 59 / 14
Регистрация: 20.12.2013
Сообщений: 732
25.12.2017, 06:35
Принципиально записывать в массив символов? В std::string значительно проще и нагляднее.

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
#include "stdafx.h"
#include <iostream>
using namespace std;
 
int main() {
    setlocale(LC_CTYPE, "rus");
    int str;
    cout << "Укажите количество строк: "; 
    cin >> str;
    const int num = 200;
    char **arrLines = new char *[str];
    for (int i = 0; i < str; i++) arrLines[i] = new char[num];
 
    cout << "\nВведите строки: \n";
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    for (int i = 0; i < str; i++) cin.getline(arrLines[i], num);
 
    for (int i = 0; i < str; ++i) cout << arrLines[i] << '\n';
    for (int i = 0; i < str; i++) delete[] arrLines[i];
    delete[] arrLines;
 
    char ch;
    cin >> ch;
}
1
8 / 8 / 2
Регистрация: 08.07.2016
Сообщений: 157
25.12.2017, 13:52  [ТС]
AndrSlav, мне потом нужно посчитать количество гласных букв в каждой строке, string потом можно разбить на символы? я гуглила и не нашла.
0
71 / 59 / 14
Регистрация: 20.12.2013
Сообщений: 732
25.12.2017, 13:56
Kamila11, конечно можно, со string можно обращаться как с массивом символов.
1
8 / 8 / 2
Регистрация: 08.07.2016
Сообщений: 157
25.12.2017, 14:20  [ТС]
Lambont, я добавила вывод скопированных строк на экран и попробовала считать с помощью cin и c помощью gets. потом сделала скрин перед закрытием консоли и увидела, что в случае cin строки считывались до пробела, а потом переходило к следующей строке. а в случае gets строки записывались и выводились полностью, только не в столбик, а как будто с пробелами после строк

Добавлено через 10 минут
AndrSlav, я сделала так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
 
int main()
{
    setlocale(LC_CTYPE, "rus");
    int str;
    cout<"Укажите количество строк: "; cin>>str;
    
    string *arrLines = new string [str];
    for(int i = 0; i < str; i++) cin>>arrLines[i];
}
но только три строки копируются. у меня уже отчаяние, что я делаю не так?
0
93 / 91 / 62
Регистрация: 23.11.2013
Сообщений: 242
25.12.2017, 14:20
Kamila11, Ну, всё именно так.
Так вам нужно все 17 строк "распихать" в отдельные 17 строк в двумерном массиве? Тогда это к cin.
Или вы хотите чтобы на выходе получилось только 2 строки:
Первая: imcv x eo gbgrxctacxnmb l qfncurtgnudv gd pfmz mbyb o
Вторая: bsqvo nwydzky vj keyuegpglw zz rfusyrqgoqv wspr
1
8 / 8 / 2
Регистрация: 08.07.2016
Сообщений: 157
25.12.2017, 14:26  [ТС]
Lambont, не нужно распихивать.
Цитата Сообщение от Lambont Посмотреть сообщение
Первая: imcv x eo gbgrxctacxnmb l qfncurtgnudv gd pfmz mbyb o
Вторая: bsqvo nwydzky vj keyuegpglw zz rfusyrqgoqv wspr
вот так и должно быть. извините, я недостаточно точно донесла условие задания
0
71 / 59 / 14
Регистрация: 20.12.2013
Сообщений: 732
25.12.2017, 14:32
Лучший ответ Сообщение было отмечено Kamila11 как решение

Решение

Со "string" так можно сделать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int str;
    const int num = 200;
    char buf[200];
 
    cout << "Укажите количество строк: "; 
    cin >> str;
    
    string *arrLines = new string[str];
 
    cout << "\nВведите строки: \n";
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    for (int i = 0; i < str; i++)
    {
        cin.getline(buf, num);
        arrLines[i] = buf;
    };
 
    for (int i = 0; i < str; ++i) cout << arrLines[i] << '\n';
    delete[] arrLines;
 
    char ch;
    cin >> ch;
1
93 / 91 / 62
Регистрация: 23.11.2013
Сообщений: 242
25.12.2017, 14:35
Kamila11, а, вот оно как
Ну тогда AndrSlav привёл отличный способ, с помощью метода getline
0
8 / 8 / 2
Регистрация: 08.07.2016
Сообщений: 157
25.12.2017, 14:44  [ТС]
AndrSlav, спасибо, добавила #include <limits> и заработало)
Lambont, спасибо большое за помощь!

Добавлено через 50 секунд
Цитата Сообщение от AndrSlav Посмотреть сообщение
char ch;
* * cin >> ch;
а это зачем нужно?
0
93 / 91 / 62
Регистрация: 23.11.2013
Сообщений: 242
25.12.2017, 14:53
Kamila11,
а это зачем нужно?
Ну для того, чтобы программа сразу не завершала свою работу после вывода, а ожидала ввод символа и уже только после ввода завершилась.
Если дело происходит под windows, то также можно написать:
C++
1
system("pause");
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.12.2017, 14:53
Помогаю со студенческими работами здесь

Заполнить двумерный динамический массив строками
Здравствуйте! Помогите,пожалуйста.Нужна программа, чтобы считывать строку и записывать её в массив, и так по порядку. Вроде всё просто, но...

Создать динамический двумерный массив и заполнить его
Всем привет. Помогите пожалуйста реализовать код. ТЗ: Создать программу с динамическим двумерным массивом, размерность запрашивать с...

Заполнить двумерный динамический массив случайным образом
Написать функции для работы с двумерным динамическим массивом: - создать массив указанного размера(строки, столбцы) - заполнить...

Заполнить динамический двумерный массив 0 под главной диагональю
Уважаемые форумчане, подскажите, пожалуйста, что нужно дописать, чтоб в этом массиве под главной диагональю были 0, увы, пока что не совсем...

Почему мне не удается заполнить двумерный булевый динамический массив?
Кносоль разрешает ввод только трех значений. #include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace std; int main() { int...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru