Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Полярный
 Аватар для dimcoder
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
1

Программа которая изменяет динамический массив строк - Написал, но есть ошибка

23.05.2012, 10:48. Показов 835. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток. В общем сделал программу, которая вкратце делает следующее:
1) Создает динамических массив строк char **m
2) Просит юзера вводить строки, когда закончит нажать ctrl+z и Enter
a) После ввода строки, вызывается функция добавления этой строки в массив m
3) После ввода программа выводит полученный массив

Но раз уж я здесь, значит есть косяк. Когда ввожу строки (ввел строку, нажал ввод), после некоторого числа строк (варьируется 3-15), программа просто виснет. Стоит секунд 20-30, как будто зациклилась(см. скриншот). Вводить ничего не получается. Потом вылетает. Работаю в DevCpp, на Borland'е тоже испытал - та же хрень. Думаю что что-то намудрил с памятью, хотя проверял неоднократно. Собственно код:

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
#include <cstdlib>
#include <iostream>
#include <ctime>
 
using namespace std;
 
void add_element(char ***m, int &k, const char *s)
{
    char **buf = new char*[k];                //Delaem copiyu
    for (int i = 0; i < k; i++)
        buf[i] = new char[strlen((*m)[i])];
    for (int i = 0; i < k; i++)
        strcpy(buf[i], (*m)[i]);
        
    for (int i = 0; i < k; i++)              //Ochischaem pamyat'
        delete [] ((*m)[i]);  
    delete [] (*m);
    
    (*m) = new char*[k+1];                   //Sozdaem novyu massiv
    for (int i = 0; i < k; i++)
        (*m)[i] = new char[strlen(buf[i])];
    (*m)[k] = new char[strlen(s)];
    
    for (int i = 0; i < k; i++)               //Zapolnyaem ego iz kopii
        strcpy((*m)[i], buf[i]);
    strcpy((*m)[k], s);
    
    for (int i = 0; i < k; i++)                //Ochischaem pamyat'
        delete [] (buf[i]);  
    delete [] buf;
    k++;
}
 
int main(int argc, char *argv[])
{
    int k = 0;
    char **m = new char*[k];               
    for (int i = 0; i < k; i++)
        m[i] = new char[k];
    char s[200];
    
    while (cin >> s)                      //Vvodym stroku...
    {
        add_element(&m, k, s);           //Zapysyvaem ee v massiv
    }
    
    cout << k << endl;            //Skol'ko v obschem strok vveli 
    
    for (int i = 0; i < k; i++)         //Vyvod samih strok
        cout << m[i] << endl; 
                  
    for (int i = 0; i < k; i++)          //Osvobozhdaem pamyat'
        delete [] (m[i]);  
    delete [] m;
    
    system("PAUSE > NULL");
    return EXIT_SUCCESS;
}
Надеюсь на помощь. Буду очень благодарен.
Миниатюры
Программа которая изменяет динамический массив строк - Написал, но есть ошибка  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.05.2012, 10:48
Ответы с готовыми решениями:

Динамический массив строк. (Ошибка)
Добрый вечер, не получается создать динамический массив строк, ошибка в char **strArr; Идея в том, чтобы из char str =...

Программа, которая заполняет динамический массив случ. числами в диапозоне от 0 до 100
Надо реализовать windowsform программу, которая заполняет динамический массив случ. числами в диапозоне от 0 до 100. Знаю как реализовать...

Программа, которая помещает в массив строк текст, введенный пользователем
Создайте программу, которая помещает в массив строк текст, введенный пользователем. При вводе пустой строки или вводе десятой строки...

7
157 / 157 / 27
Регистрация: 29.03.2012
Сообщений: 418
23.05.2012, 11:30 2
зачем вам в функции такой параметр char ***m? почему бы не сделать так char **m, тогда обращеие к строке будет m[i], и вызов функции будет add_elem(m,k,s)
1
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
23.05.2012, 11:55 3
Цитата Сообщение от dimcoder Посмотреть сообщение
char **buf = new char*[k]; * * * * * * * *//Delaem copiyu
* * for (int i = 0; i < k; i++)
* * * * buf[i] = new char[strlen((*m)[i])];
Есть strdup

Да и код не хорошо написан. Вам нужно написать, что-то вроде realloc в Си.
1
157 / 157 / 27
Регистрация: 29.03.2012
Сообщений: 418
23.05.2012, 11:59 4
еще если не ошибаюсь strlen возвращает длину без завершающего символа, strcpy копирует строку вместе с ним.
1
Полярный
 Аватар для dimcoder
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
23.05.2012, 21:03  [ТС] 5
Цитата Сообщение от antoha398 Посмотреть сообщение
зачем вам в функции такой параметр char ***m?
Если передать не так, то получиться копия массива, который был в main(), и следовательно массив в main() функция не изменит. Только память получиться очистить так.
Цитата Сообщение от go Посмотреть сообщение
Да и код не хорошо написан.
Почему?
Цитата Сообщение от go Посмотреть сообщение
Вам нужно написать, что-то вроде realloc в Си.
Вот за это спасибо!
Цитата Сообщение от antoha398 Посмотреть сообщение
еще если не ошибаюсь strlen возвращает длину без завершающего символа
Во, точно - как я так это пропустил?! В этом и была ошибка! Спасибо большое!
0
157 / 157 / 27
Регистрация: 29.03.2012
Сообщений: 418
23.05.2012, 21:33 6
Цитата Сообщение от dimcoder Посмотреть сообщение
Если передать не так, то получиться копия массива, который был в main(), и следовательно массив в main() функция не изменит. Только память получиться очистить так.
**m это указатель, никакой копии массива не будет. Функция будет работать с тем же массивом.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
23.05.2012, 21:50 7
Цитата Сообщение от dimcoder Посмотреть сообщение
Если передать не так, то получиться копия массива, который был в main(), и следовательно массив в main() функция не изменит.
Копия чего-чего? Может быть копия указателя? Так передавать нужно по ссылке. Нужное замечание, я его и недосмотрел.
C++
1
void add_element(char** &m, int &k, const char *s)
И почему бы не использовать std::string, std::vector?
1
Полярный
 Аватар для dimcoder
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
24.05.2012, 07:53  [ТС] 8
Цитата Сообщение от go Посмотреть сообщение
Так передавать нужно по ссылке.
Когда программа не работала, было как то не важно, по ссылке или нет. Главное что бы заработала, а потом поправки. Но все же спасибо.
Цитата Сообщение от go Посмотреть сообщение
И почему бы не использовать std::string, std::vector?
В том то и задача, что бы без них. Практикуюсь, так сказать.

Не по теме:

PS Мдааа, вчера в последнем моем сообщении набредил я малость

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.05.2012, 07:53
Помогаю со студенческими работами здесь

Программа, которая считывает то, что написал пользователь, и принимает решение в зависимости от считанного
Здравствуйте! Захотел написать себе напоминалку, но столкнулся с одной проблемой. Суть программы такова: Программа задает пользователю...

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

Написал программу в DEV C++ но есть ошибка с srand(time(NULL); int size = rand() % 150; ПОМОГИТЕ ПЖ!
#include &lt;TCHAR.h&gt; #include &lt;iostream&gt; #include &lt;time.h&gt; #include &lt;ctime&gt; using namespace std; int _tmain(int argc,...

Есть ли в Java -динамический массив?
Есть ли в Java -динамический массив? Есть мнение что в Java нет динамических массивов, что так неправильно отвечать. Так ли это ? ...

Динамический массив строк
Здравствуйте, подскажите, пожалуйста. Пишу программу, нужно читать строки и их количество из текстового файла и записывать их в объект...


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

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

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Вопросы на собеседовании по Android
mobDevWorks 14.03.2025
По данным статистики, Android занимает более 70% мирового рынка мобильных операционных систем, что делает платформу привлекательной как для начинающих разработчиков, так и для опытных профессионалов. . . .
Лучшие игровые движки для Python
py-thonny 14.03.2025
Python обеспечивает разработчиков игр мощными движками и фреймворками, которые позволяют воплотить практически любую идею — от простой аркады до визуального романа с разветвленным сюжетом. Главное. . .
Бессерверный JavaScript: Разработка масштабируемых API с AWS Lambda
run.dev 14.03.2025
Но что такое бессерверные вычисления на самом деле? По сути, это модель облачных вычислений, где разработчик фокусируется исключительно на создании бизнес-логики, не тратя время на настройку. . .
Безопасность кода в C++26: Менеджеры ресурсов и висячие ссылки
NullReferenced 14.03.2025
C++ всегда был языком, предоставляющим разработчикам большие возможности и гибкость, но вместе с тем требующим ответственности. Одной из самых коварных проблем даже для опытных программистов остаются. . .
smart-agent proper interface settings (2025)
jigi33 14.03.2025
Smart-agent proper interface settings (mart 2025). (see screenshots to look at "Etalon" ARM)
Продвинутые настройки JVM
Javaican 14.03.2025
Стандартные параметры запуска JVM хороши для повседневной разработки, но совершенно недостаточны для высоконагруженных систем. Представьте, что вы запускаете финансовую платформу, обрабатывающую. . .
CI/CD для приложений Java с Azure DevOps и Docker
Mr. Docker 14.03.2025
Разработка современных Java-приложений немыслима без системы непрерывной интеграции и доставки (CI/ CD). Azure DevOps в сочетании с Docker предоставляет мощный инструментарий для создания таких. . .
Разработка на PHP и интернет вещей (IoT)
Jason-Webb 14.03.2025
Интернет вещей (IoT) произвел настоящую революцию в способах взаимодействия устройств с окружающим миром. В эпоху, когда холодильники сами заказывают молоко, а термостаты учатся вашим привычкам,. . .
Node.js 20: Новые возможности и улучшения производительно­сти
Reangularity 14.03.2025
Что же принёс нам релиз Node. js 20? В первую очередь, это существенные улучшения в производительности. Движок V8 получил серьёзные оптимизации, благодаря чему JavaScript-код выполняется заметно. . .
Безопасность кластеров Apache Kafka
Javaican 14.03.2025
Apache Kafka стал одним из ключевых компонентов современных архитектур, обрабатывающих потоки данных в режиме реального времени. Его используют тысячи компаний от стартапов до технологических. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru