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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
emmure
2 / 2 / 0
Регистрация: 15.12.2012
Сообщений: 93
#1

Ввод двумерного динамического массива с консоли - C++

24.04.2013, 17:54. Просмотров 1767. Ответов 31
Метки нет (Все метки)

Здравствуйте, помогите пожалуйста, мне нужно ввести с консоли двумерный массив, мне известна максимальная длинна строки, но я не знаю максимальное количество этих строк. Как я понимаю нужно выделять память под строки по мере ввода, если я правильно понимаю то это можно сделать как-то с помощью malloc,realloc только хз как.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2013, 17:54     Ввод двумерного динамического массива с консоли
Посмотрите здесь:

Ввод-вывод двумерного динамического массива - C++
Здраствуйте. Задана задача, в ходе которой нужно ввести динамический массив(каждый елемент с новой строчки), а затем вывести его уже как...

Cоздание двумерного динамического массива - C++
как задать двумерный массив , границы которого m и n вводятся с клавиатуры? для одномерного массива есть команда int *a=new int; ...

Использование двумерного динамического массива - C++
Здравствуйте, уважаемые форумчане. Такой вопрос: я объявил двумерный дин. массив, выделил, память, сделал с ним что-то int **arr =...

Использование динамического двумерного массива - C++
Вот есть такой заголовочный файл // Заголовочный файл Vector.h #ifndef VECTOR_H #define VECTOR_H template<typename TT> ...

Массив: создание динамического двумерного массива - C++
Создаю двумерный динамический массив. После ввода m n - конец программы. Помогите, пожалуйста. # include <iostream> using namespace...

Максимальный элемент динамического двумерного массива - C++
Напишите пожалуйста программу которая находила бы максимальный элемент динамического двумерного массива

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
24.04.2013, 17:56     Ввод двумерного динамического массива с консоли #2
new, delete
oxotnik
1589 / 1066 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
24.04.2013, 17:57     Ввод двумерного динамического массива с консоли #3
C++
1
std::vector <std::vector>> array;
emmure
2 / 2 / 0
Регистрация: 15.12.2012
Сообщений: 93
24.04.2013, 18:06  [ТС]     Ввод двумерного динамического массива с консоли #4
Цитата Сообщение от Vourhey Посмотреть сообщение
new, delete
если я правильно понял вы хотите выделять память с помощью new char, но вроде он не подходит для данной задачи т.к new затирает значение которые были введены ранее

Добавлено через 44 секунды
Цитата Сообщение от oxotnik Посмотреть сообщение
C++
1
std::vector <std::vector>> array;
если не трудно, хотелось бы увидеть полную реализацию
и если это возможно через обычный двумерный массив, с указателями
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
24.04.2013, 18:07     Ввод двумерного динамического массива с консоли #5
Цитата Сообщение от emmure Посмотреть сообщение
т.к new затирает значение которые были введены ранее
Что он, сори, затирает? С какого перепуга и где?
emmure
2 / 2 / 0
Регистрация: 15.12.2012
Сообщений: 93
24.04.2013, 18:11  [ТС]     Ввод двумерного динамического массива с консоли #6
Цитата Сообщение от Vourhey Посмотреть сообщение
Что он, сори, затирает? С какого перепуга и где?
ну как мне обьяснили допустим, у нас есть
C++
1
2
3
4
int str = 0;
char **txt 
txt = new char*[1];// я выделяю одну строку
txt[str] = new char[100];//я выделяю 100 символов под эту строку
и разве если я ещё раз напишу
C++
1
txt = new char*[1];//я выделю ещё одну строку?или же затру старую?
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
24.04.2013, 18:15     Ввод двумерного динамического массива с консоли #7
Цитата Сообщение от emmure Посмотреть сообщение
// я выделяю одну строку
Выделять строку. Как прикольно звучит.
Не строку а память под массив из одного указателя.
Цитата Сообщение от emmure Посмотреть сообщение
//я выделю ещё одну строку?
Нет. Еще выделишь память под массив указателей.
Цитата Сообщение от emmure Посмотреть сообщение
или же затру старую?
Старая строка, как лежала в памяти так и будет лежать, с ней нифига не случится. Только тебе нужно не терять на нее указатель. Это твоя забота, как программиста.
emmure
2 / 2 / 0
Регистрация: 15.12.2012
Сообщений: 93
24.04.2013, 18:49  [ТС]     Ввод двумерного динамического массива с консоли #8
Цитата Сообщение от Vourhey Посмотреть сообщение
Выделять строку. Как прикольно звучит.
Не строку а память под массив из одного указателя.

Нет. Еще выделишь память под массив указателей.

Старая строка, как лежала в памяти так и будет лежать, с ней нифига не случится. Только тебе нужно не терять на нее указатель. Это твоя забота, как программиста.
Вроде понял, буду пытаться реализовать, спасибо

Добавлено через 28 минут
Скажите плз почему данный код, не выходит из цикла ввода, после ввода символа оканчания строки

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 namespace std;
int main()
{  
    char **txt = NULL,**txt2 = NULL ;
    int str=0,dl=0;
 
    txt = new char*[1];
    txt[str] = new char[100];
 
    while (true)
    {
        cin >> txt[str][dl];
        if (txt[str][dl++] == '\0')
        {
            break;
        };
    }
    for (int i=0;i<dl;i++)
    {cout<<txt[0][i];};
    system("pause");
    return 0;
}
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
24.04.2013, 18:52     Ввод двумерного динамического массива с консоли #9
Цитата Сообщение от emmure Посмотреть сообщение
Скажите плз почему данный код, не выходит из цикла ввода, после ввода символа оканчания строки
Открываешь память по своему казателю, где находится у тебя строка. И смотришь, на какой же символ ссылается по индексу dl (++ еще не выполнился). И говоришь "ааааа!".
emmure
2 / 2 / 0
Регистрация: 15.12.2012
Сообщений: 93
24.04.2013, 18:59  [ТС]     Ввод двумерного динамического массива с консоли #10
Цитата Сообщение от Vourhey Посмотреть сообщение
Открываешь память по своему казателю, где находится у тебя строка. И смотришь, на какой же символ ссылается по индексу dl (++ еще не выполнился). И говоришь "ааааа!".
я походу сильно туплю, нельзя ли поподробнее обьяснить в чём у меня проблема с кодом?
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
24.04.2013, 19:01     Ввод двумерного динамического массива с консоли #11
emmure, говорю, посмотри на свою строку в дебаггере.

Добавлено через 22 секунды
Цитата Сообщение от emmure Посмотреть сообщение
нельзя ли поподробнее
Можно. Но рано.
emmure
2 / 2 / 0
Регистрация: 15.12.2012
Сообщений: 93
24.04.2013, 22:29  [ТС]     Ввод двумерного динамического массива с консоли #12
Цитата Сообщение от Vourhey Посмотреть сообщение
emmure, говорю, посмотри на свою строку в дебаггере.

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

Можно. Но рано.
ну если я всё правильно понимаю я заполняю
допустим "Hi"

C++
1
2
3
4
s[0][dl]='H';  \\ dl=0;
if (txt[str][dl++] == '\0')  \\проверка на конец строки, после dl++;dl=1;
s[0][dl]='i';  \\ dl=1;
if (txt[str][dl++] == '\0')  \\проверка на конец строки, после dl++;dl=2;
ну а дальше он почему-то не считывает

Добавлено через 2 часа 46 минут
ответьте плз если кто может
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
25.04.2013, 02:34     Ввод двумерного динамического массива с консоли #13
Цитата Сообщение от emmure Посмотреть сообщение
cin >> txt[str][dl];
у тебя указатель на char это txt[str] откуда там второй индекс взялся на вводе? Зачем он нужен?
emmure
2 / 2 / 0
Регистрация: 15.12.2012
Сообщений: 93
25.04.2013, 02:42  [ТС]     Ввод двумерного динамического массива с консоли #14
Вот код ввода массива, почему то выдаёт ошибку как я понял при cin.getline(Arr[y],x);
Хотелось бы узнать в чём причина

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
#include <iostream>;
using namespace std;
int main()
 
{   setlocale(LC_ALL, "Russian");
    char **Arr = NULL,**newArr = NULL;
    int x = 101,y = 1,lastY=0;
 
 
    while (true)
    {  
        Arr = new char*[y];
        for (int i=0; i<y; i++)
            Arr[i] = new char[x];
        cin.getline(Arr[y],x);
        if(strcmp(Arr[y],"")==0){break;}
        for (int i = 0; i<lastY; i++)
            Arr[i] = newArr[i];
        newArr = new char*[y];
        for (int i=0; i<y; i++)
            newArr[i] = Arr[i];
        lastY=y;
        y++;
    }
    y--;
    system("pause");
    return 0;
}
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
25.04.2013, 02:52     Ввод двумерного динамического массива с консоли #15
Потому что ты память не выделил. Arr[y] у тебя ни на что хорошее не указывает. И не будет.
C++
1
cin.getline(Arr[y-1],x);
emmure
2 / 2 / 0
Регистрация: 15.12.2012
Сообщений: 93
25.04.2013, 02:53  [ТС]     Ввод двумерного динамического массива с консоли #16
ой всё понял ошибку)
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
25.04.2013, 02:54     Ввод двумерного динамического массива с консоли #17
И вообще, используй теги для кода. Ничего же не видно...
emmure
2 / 2 / 0
Регистрация: 15.12.2012
Сообщений: 93
25.04.2013, 03:07  [ТС]     Ввод двумерного динамического массива с консоли #18
Блин если честно не могу тут найти тэги.
Вот опять проблема с кодом, хотел очистить память, занятую под массив указателей на строки, но почему то не получилось, ввожу первую строку вроде всё нормально, но после ввода второй строки вылетает ошибка
Кликните здесь для просмотра всего текста

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>;
using namespace std;
int main()
 
{   setlocale(LC_ALL, "Russian");
    char **newArr = NULL;
    int x = 101,y = 1,lastY=0;
 
 
    while (true)
    {  
        char **Arr = new char*[y];
        for (int i=0; i<y; i++)
            Arr[i] = new char[x];
        cin.getline(Arr[lastY],x);
        if(strcmp(Arr[lastY],"")==0){break;}
        for (int i = 0; i<lastY; i++)
            Arr[i] = newArr[i];
        newArr = new char*[y];
        for (int i=0; i<y; i++)
            newArr[i] = Arr[i];
        lastY=y;
        y++;
        for(int i = 0; i<lastY; i++)
        delete(Arr[i]);
        delete(Arr);
    }
    y--;
    system("pause");
    return 0;
}
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
25.04.2013, 07:25     Ввод двумерного динамического массива с консоли #19
Цитата Сообщение от emmure Посмотреть сообщение
Блин если честно не могу тут найти тэги.
C++
1
2
3
for(int i=0; i<size; i++)
    cout<<a[i]<<"\t";
//and other code
Миниатюры
Ввод двумерного динамического массива с консоли  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2013, 08:02     Ввод двумерного динамического массива с консоли
Еще ссылки по теме:

Передача динамического двумерного массива в функцию - C++
Я сделал вот так: void PrintMatrix(int** matrix, int&amp; n, int&amp; m) { for (int i = 0; i &lt; n; i++) { cout &lt;&lt; &quot;Row &quot; &lt;&lt; (i...

Передача динамического двумерного массива в процедуру - C++
Написал вот такой код для одномерного динамического массива #include &lt;iostream&gt; #include &lt;clocale&gt; using namespace std; ...

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

Создание двумерного динамического массива в функции - C++
Здравствуйте. Скажите где я допустил ошибку в создании динамического массива? #include&lt;stdio.h&gt; #include&lt;conio.h&gt; #include&lt;stdlib.h&gt; ...


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

Или воспользуйтесь поиском по форуму:
emmure
2 / 2 / 0
Регистрация: 15.12.2012
Сообщений: 93
25.04.2013, 08:02  [ТС]     Ввод двумерного динамического массива с консоли #20
спасибо

Добавлено через 1 минуту
но вопрос остаётся открытым почему выдаёт ошибку
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
#include <iostream>;
using namespace std;
int main()
 
{ setlocale(LC_ALL, "Russian");
char **newArr = NULL;
int x = 101,y = 1,lastY=0;
while (true)
{ 
    char **Arr = new char*[y];
    for (int i=0; i<y; i++)
        Arr[i] = new char[x];
    cin.getline(Arr[lastY],x);
    if(strcmp(Arr[lastY],"")==0){break;}
    for (int i = 0; i<lastY; i++)
        Arr[i] = newArr[i];
    newArr = new char*[y];
    for (int i=0; i<y; i++)
        newArr[i] = Arr[i];
    lastY=y;
    y++;
    for(int i = 0; i<lastY; i++)
        delete(Arr[i]);
    delete(Arr);
}
y--;
system("pause");
return 0;
}
Yandex
Объявления
25.04.2013, 08:02     Ввод двумерного динамического массива с консоли
Ответ Создать тему
Опции темы

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