С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

17.04.2011, 02:42. Просмотров 569. Ответов 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';
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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++
Всем доброго утра/вечера/дня. Возникла такая проблема. Не могу создать динамический массив строк. Т.е. нужно при вводе с клавиатуры...

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

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

11
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
17.04.2011, 10:11 #2
Строка 71 - Это не копирование строки, ты заблужаешься. Это приводит к утечке памяти.
Строка 74 - Вообще не известно что.
Строка 79 - Фсё, данных в _charr нету.
_charr тоже удалять надо под конец.
0
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 соотвественно) вот тут то появляется проблема
программа просто зависает не выдая никакой ошибки
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
17.04.2011, 12:02 #4
Цитата Сообщение от Deviaphan Посмотреть сообщение
Это не копирование строки, ты заблужаешься. Это приводит к утечке памяти.
В этом основная проблема.
Ты не копируешь строку, ты перезаписываешь указатель.
1
Zero-cool
5 / 5 / 1
Регистрация: 05.01.2011
Сообщений: 30
17.04.2011, 12:55  [ТС] #5
спасибо,с копированием разобрался. но почему игнорируется ввод строки?(66 сторка)
1
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
17.04.2011, 13:05 #6
71 и 74 поправил?
Почему думаешь, что игнорируются?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
17.04.2011, 13:06 #7
Zero-cool, В потоке остается \n после cin. Поставь перед cin.getline(), cin.get().
1
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
0
vitaska
86 / 86 / 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;
0
Zero-cool
5 / 5 / 1
Регистрация: 05.01.2011
Сообщений: 30
18.04.2011, 00:10  [ТС] #10
заменил, ошибка так и не показывается, пробывал на VS2010 (у меня VS2008) пишет промахиваюсь по памяти(но перед этим заменил простое присвоение строк функцией strcpy()) уже голову сломал над етой задачей не пойму почему неполучается удалить, ведь правильно удаление описано...
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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';
}
1
Zero-cool
5 / 5 / 1
Регистрация: 05.01.2011
Сообщений: 30
18.04.2011, 01:20  [ТС] #12
Большое спасибо!!а ведь ларчик просто открывался=)
0
18.04.2011, 01:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.04.2011, 01:20
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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