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

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

Войти
Регистрация
Восстановить пароль
 
Zero-cool
5 / 5 / 1
Регистрация: 05.01.2011
Сообщений: 30
#1

Уничтожение динамического массиа строк - C++

17.04.2011, 02:42. Просмотров 558. Ответов 11
Метки нет (Все метки)

Собсно вот метод:
C++
1
2
3
    //for(int i=0;i<=n;i++)
    //delete[] charr[i];
    //delete charr;
НО в моей програме он выбивает ошибку(компилируется нормально)
(задача - добавить строку, после строки наибольшей длины)
но считать эту строку програма "забывает" спросить
C++
1
2
    char* plus=new char[200];
    cin.getline(plus,200);
вот весь код
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
78
79
80
81
82
83
84
85
86
#include <iostream>
#include <clocale>
#include <string.h>
using namespace std;
int main()
{
void form(char** charr,char** _charr,int n);
void init(char** charr,int n);
void maxplus(char** charr,char** _charr,int n);
void printplus(char**_charr,int n);
int n;
setlocale(LC_ALL,"Russian");
cout<<"Введiть кiлькiсть рядкiв"<<endl;
cin>>n;
cout<<"1. Сформувати масив рядкiв\n";
cout<<"2. Iнiцiалiзувати масив\n";
cout<<"3. Провести дії\знищити масив\n";
cout<<"4. Виведення обробленного масиву\n";
cout<<"5. Вихiд\n";
char **charr=new char* [n];
char **_charr=new char* [n+1];
int k;
    do
    {   
        cout<<"Очiкування введення:"<<endl;
        cin>>k;
        switch (k)
        {
            case 1: form(charr,_charr,n); break;
            case 2: init(charr,n);break;
            case 3: maxplus(charr,_charr,n); break;
            case 4: printplus(_charr,n); break;
        }
    }
        while(k!=5);
return 0; 
}
void form(char** charr,char** _charr,int n)
{
    for(int i=0;i<=n;i++)
    charr[i]=new char[255];
    for(int i=0;i<=n+1;i++)
    _charr[i]=new char[255];
}
 
void init(char **charr,int n)
{
    cout<<"Введiть рядки"<<endl;
    for(int i=0;i<=n;i++)
    cin.getline(charr[i],255);
}
void maxplus(char** charr,char** _charr,int n)
{
    int maxln(0),currln(0),point;
    for(int i=0;i<=n;i++)
    {
        currln=strlen(charr[i]);
        if(currln>maxln)
        {
            maxln=currln;
            point=i;
        }
    }
    cout<<"input string"<<endl;
    char* plus=new char[200];
    cin.getline(plus,200);
    int pplus(-1);
    for(int i=0;i<=n;i++)
    {
        pplus++;
        _charr[pplus]=charr[i];
        if(i==point)
        {
            _charr[i+1]=plus;
            pplus++;
        }
    }
    for(int i=0;i<=n;i++)
    delete[] charr[i];
    delete charr;
}
void printplus(char**_charr,int n)
{
    for(int i=0;i<=n+1;i++)
    cout<<_charr[i]<<'\n';
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.04.2011, 02:42     Уничтожение динамического массиа строк
Посмотрите здесь:

Поиск наименьшего расстояния от одного элемента массиа до остальных - C++
Дан неотсортированный массив чисел (но это не беда, отсортируем...) тогда получится отсортированный по возрастанию массив чисел)) В нём...

Создание динамического массива строк - C++
Всем доброго утра/вечера/дня. Возникла такая проблема. Не могу создать динамический массив строк. Т.е. нужно при вводе с клавиатуры...

Удаление динамического массива строк - C++
Здравствуйте! У меня проблема с удалением массива строк.Создал класс с полем - char** str; резервирую память(делаю это в конструкторе) ...

СОртировка динамического массива строк - C++
#include &lt;conio.h&gt; #include &lt;stdio.h&gt; #include &lt;locale&gt; #include &lt;iostream&gt; #include &lt;string.h&gt; using namespace std; void...

Проверка класса динамического массива строк - C++
Проверьте пожалуйста код программы, написанный мной по следующему условию: Код: #include &quot;stdafx.h&quot; #include...

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

Передача динамического массива строк в функцию - C++
что не так? программа проверяет правильность скобок для каждой строки #define _CRT_SECURE_NO_WARNINGS #include &lt;iostream&gt; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
17.04.2011, 10:11     Уничтожение динамического массиа строк #2
Строка 71 - Это не копирование строки, ты заблужаешься. Это приводит к утечке памяти.
Строка 74 - Вообще не известно что.
Строка 79 - Фсё, данных в _charr нету.
_charr тоже удалять надо под конец.
Zero-cool
5 / 5 / 1
Регистрация: 05.01.2011
Сообщений: 30
17.04.2011, 11:54  [ТС]     Уничтожение динамического массиа строк #3
мне интересно узнать почему программа игнорирует строку 66,
C++
1
cin.getline(plus,200);
и если "заработает" ввод строки plus то строка 74 будет иметь смысл=)
и по поводу удаления _charr(и просто charr соотвественно) вот тут то появляется проблема
программа просто зависает не выдая никакой ошибки
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
17.04.2011, 12:02     Уничтожение динамического массиа строк #4
Цитата Сообщение от Deviaphan Посмотреть сообщение
Это не копирование строки, ты заблужаешься. Это приводит к утечке памяти.
В этом основная проблема.
Ты не копируешь строку, ты перезаписываешь указатель.
Zero-cool
5 / 5 / 1
Регистрация: 05.01.2011
Сообщений: 30
17.04.2011, 12:55  [ТС]     Уничтожение динамического массиа строк #5
спасибо,с копированием разобрался. но почему игнорируется ввод строки?(66 сторка)
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
17.04.2011, 13:05     Уничтожение динамического массиа строк #6
71 и 74 поправил?
Почему думаешь, что игнорируются?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
17.04.2011, 13:06     Уничтожение динамического массиа строк #7
Zero-cool, В потоке остается \n после cin. Поставь перед cin.getline(), cin.get().
Zero-cool
5 / 5 / 1
Регистрация: 05.01.2011
Сообщений: 30
17.04.2011, 22:36  [ТС]     Уничтожение динамического массиа строк #8
Цитата Сообщение от Deviaphan Посмотреть сообщение
71 и 74 поправил?
Почему думаешь, что игнорируются?
да поправил. программа должна запросить строку, которую нужно вставить после самой длинной строки
В потоке остается \n после cin. Поставь перед cin.getline(), cin.get().
спасибо стало спрашивать строку
но вопрос с уничтожением ещё не решён, попрежнему стопорится программа.
ошибке хочется быть инкогнито=)

Добавлено через 5 часов 23 минуты
на правах up'a
vitaska
84 / 84 / 2
Регистрация: 04.02.2010
Сообщений: 162
17.04.2011, 23:02     Уничтожение динамического массиа строк #9
Цитата Сообщение от Zero-cool Посмотреть сообщение
for(int i=0;i<=n;i++)
delete[] charr[i];
delete charr;
замените на
C++
1
2
3
for(int i=0;i<n;i++)
 delete[] charr[i];
 delete [] charr;
Zero-cool
5 / 5 / 1
Регистрация: 05.01.2011
Сообщений: 30
18.04.2011, 00:10  [ТС]     Уничтожение динамического массиа строк #10
заменил, ошибка так и не показывается, пробывал на VS2010 (у меня VS2008) пишет промахиваюсь по памяти(но перед этим заменил простое присвоение строк функцией strcpy()) уже голову сломал над етой задачей не пойму почему неполучается удалить, ведь правильно удаление описано...
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
18.04.2011, 00:19     Уничтожение динамического массиа строк #11
Zero-cool, Лови... Во всех функциях был выход за пределы массивов.

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
78
79
80
81
82
83
84
85
86
87
88
89
#include <iostream>
#include <clocale>
#include <string.h>
using namespace std;
int main()
{
void form(char** charr,char** _charr,int n);
void init(char** charr,int n);
void maxplus(char** charr,char** _charr,int n);
void printplus(char**_charr,int n);
int n;
setlocale(LC_ALL,"Russian");
cout<<"Введiть кiлькiсть рядкiв"<<endl;
cin>>n;
cout<<"1. Сформувати масив рядкiв\n";
cout<<"2. Iнiцiалiзувати масив\n";
cout<<"3. Провести дії\знищити масив\n";
cout<<"4. Виведення обробленного масиву\n";
cout<<"5. Вихiд\n";
char **charr=new char* [n];
char **_charr=new char* [n+1];
int k;
        do
        {       
                cout<<"Очiкування введення:"<<endl;
                cin>>k;
                switch (k)
                {
                        case 1: form(charr,_charr,n); break;
                        case 2: init(charr,n);break;
                        case 3: maxplus(charr,_charr,n); break;
                        case 4: printplus(_charr,n); break;
                }
        }
                while(k!=5);
return 0; 
}
void form(char** charr,char** _charr,int n)
{
        for(int i=0;i<n;i++)
        charr[i]=new char[255];
        for(int i=0;i<n+1;i++)
        _charr[i]=new char[255];
}
 
void init(char **charr,int n)
{
        cout<<"Введiть рядки"<<endl;
        cin.get();
        for(int i=0;i<n;i++)
        cin.getline(charr[i],254);
}
void maxplus(char** charr,char** _charr,int n)
{
        int maxln(0),currln(0),point;
        for(int i=0;i<n;i++)
        {
                currln=strlen(charr[i]);
                if(currln>maxln)
                {
                        maxln=currln;
                        point=i;
                }
        }
        cout<<"input string"<<endl;
        char* plus=new char[200];
        cin.get();
        cin.getline(plus,199);
        int pplus(-1);
        for(int i=0;i<n;i++)
        {
                pplus++;
                strcpy(_charr[pplus], charr[i]);
                if(i==point)
                {
                        strcpy(_charr[i+1], plus);
                        _charr[i+1]=plus;
                        pplus++;
                }
        }
        for(int i=0;i<n;i++)
        delete[] charr[i];
        delete charr;
}
void printplus(char**_charr,int n)
{
        for(int i=0;i<n+1;i++)
        cout<<_charr[i]<<'\n';
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.04.2011, 01:20     Уничтожение динамического массиа строк
Еще ссылки по теме:

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

Можно ли определить размер динамического двумерного массива, количество строк и столбцов? - C++
help

Уничтожение массива - C++
Здравствуйте,мне нужна ваша помощь в написании программы с массивами.Условие задачи:Выполнить уничтожения указанных элементов массива:N...

Уничтожение указанных объектов - C++
Здравствуйте. Не могу разобраться как реализовать следующее: Имеется класс Human, далее необходимо сделать класс Murderer который по...

Правильное уничтожение объекта - C++
Добрый день, имеется следующий вопрос! Есть некоторый класс, который на вход (в конструктор) получает аргументы, после чего парсит их....


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

Или воспользуйтесь поиском по форуму:
Zero-cool
5 / 5 / 1
Регистрация: 05.01.2011
Сообщений: 30
18.04.2011, 01:20  [ТС]     Уничтожение динамического массиа строк #12
Большое спасибо!!а ведь ларчик просто открывался=)
Yandex
Объявления
18.04.2011, 01:20     Уничтожение динамического массиа строк
Ответ Создать тему
Опции темы

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