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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
emmure
2 / 2 / 0
Регистрация: 15.12.2012
Сообщений: 93
24.04.2013, 17:54     Ввод двумерного динамического массива с консоли #1
Здравствуйте, помогите пожалуйста, мне нужно ввести с консоли двумерный массив, мне известна максимальная длинна строки, но я не знаю максимальное количество этих строк. Как я понимаю нужно выделять память под строки по мере ввода, если я правильно понимаю то это можно сделать как-то с помощью malloc,realloc только хз как.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6469 / 2244 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
24.04.2013, 17:56     Ввод двумерного динамического массива с консоли #2
new, delete
oxotnik
 Аватар для oxotnik
1584 / 1061 / 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
Почетный модератор
6469 / 2244 / 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
Почетный модератор
6469 / 2244 / 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
Почетный модератор
6469 / 2244 / 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
Почетный модератор
6469 / 2244 / 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
Почетный модератор
6469 / 2244 / 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
Почетный модератор
6469 / 2244 / 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
Почетный модератор
6469 / 2244 / 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оздание двумерного динамического массива C++
Сортировка двумерного динамического массива C++
Заполнение двумерного динамического массива C++

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

Или воспользуйтесь поиском по форуму:
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     Ввод двумерного динамического массива с консоли
Ответ Создать тему
Опции темы

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