3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
|
||||||
1 | ||||||
Преобразовать текст, удалив все ‘*’ и повторив дважды каждый символ, отличный от ‘*’30.12.2010, 21:45. Показов 4079. Ответов 29
Метки нет (Все метки)
всем привет
народ помогите разобраться в чем ошибка, программа почему то печатает левое при наборе 3 и более строк вот задание данное мне Ввести массив строк символов (текст), которые могут содержать символы ‘*’. Преобразовать текст, удалив все ‘*’ и повторив дважды каждый символ, отличный от ‘*’.
Добавлено через 3 часа 24 минуты разве никто не знает в чем причина? что не так в моем коде то??
0
|
30.12.2010, 21:45 | |
Ответы с готовыми решениями:
29
Преобразовать текст, удалив все ‘*’ и повторив дважды каждый символ, отличный от ‘*’ Дана строка. Преобразовать ее, удалив каждый символ (*) и повторив каждый символ, отличный от (*) Преобразовать строку, удалив каждый символ * и повторив каждый символ, отличный от * Преобразовать файл, удалив каждый символ ‘*’ и повторив каждый символ, отличный от ‘*’ |
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
|
|||||||||||
31.12.2010, 20:41 | 21 | ||||||||||
Вот твой код
адресом памяти из восьми байт. Ведь
В последующих четырёх неизвестно что. Это круто, наверное. Заносим в массив char* значение и четыре байта к массиву приплюсовываем. Чтобы были. И да: сперва выделяем память. Потом инициализируем. С утра так было. Выделяет память (В ДАННОМ КОДЕ под указатели на char) функция realloc Инициализирует её (опять же в данном коде malloc ). ПРивет И да: при использовании realloc КРАЙНЕ НЕ СОВЕТУЮ освобождать память free. Если кто спросит почему- отвечу. Напильнику не беспокоиться. Он пусть освобождает. Он, наверное щас занят написанием РАБОЧЕГО кода, а то языком трепать все могут. Ну и соответственнто Добавлено через 3 минуты Короче, жду данных, на который мой код спотыкается.
0
|
481 / 119 / 17
Регистрация: 30.09.2010
Сообщений: 473
|
||||||
31.12.2010, 22:06 | 22 | |||||
Это не мой код - это мое исправление к исходному коду, которое надо вставить вместо родного цикла. А полностью комплекс мероприятий по обеспечению работоспособности цикла ввода тогда будет выглядеть так:
Не очень кузяво, сам бы я написал по другому, но ТС хочет разобраться в ошибках в своем коде, вот я и внес минимальные изменения с сохранением исходной концепции. В Си есть другой способ освобождения памяти? Цитатник идиотизмов резко пополняется. После внесения предложенных мной изменений исходный код становится рабочим (под Борманом). Некомпилируемость под другими компиляторами обусловлена другим фрагментом, исправляется движением мизинца, ты сам сказал как. Добавлено через 12 минут А надо? Такое использование глобальных переменных уже позволяет квалифицировать его как быдлокод.
0
|
5056 / 3116 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
31.12.2010, 22:55 | 23 |
kravam, эммм... Я не особо вникал в код... Но из моего опыта malloc выделяет память (т.е. берёт память из кучи и возвращает указатель типа void на её начало), а realloc перевыделяет память, выделенную ранее с помощью malloc или calloc. Освободить выделенную (или перевыделенную) память можно с помощью free.
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
|
|||||||||||
31.12.2010, 23:38 | 24 | ||||||||||
А надо было бы.
Дело в том, что если Вы посмотрите внимательно, то увидите, в каждом проходе malloc выделяет память под массив символов.
Ну то есть введено, допустим "asdfg", вот под этот массив выделена память и адрес "a" зенесён в txt[i] Угу? А теперь ВНИМАТЕЛЬНО смотрим, что делает realloc. Она ПЕРЕВЫДЕЛЯЕТ но не под массив сисволов "asdfg", отнюдь. Она перевыделяет память под МАССИВ УКАЗАТЕЛЕЙ НА НИХ txt=(char**)realloc(txt,(i+1)*sizeof(char*)); Просто? А теперь- если они выделяют память под разные элементы, порядок следования malloc realloc аннулируется Смотрим дальше. По-хорошему при первом проходе необходимо было выделить место под первый указатель Ну то есть так txt=(char**)malloc(txt,(i+1)*sizeof(char*)); ... потом этому указателю присваиваем адрес len+1 элементов, да не абы каких, а первой строки txt[i]=(char*)malloc((len+1)*sizeof(char)); А при втором третьем и так делее проходах (заменяем malloc на realloc) txt=(char**)realloc(txt,(i+1)*sizeof(char*)); ... txt[i]=(char*)malloc((len+1)*sizeof(char)); Но я уж не стал усложнят это дело, если при первом проходе канает запись txt=(char**)realloc(txt,(i+1)*sizeof(char*)); ... txt[i]=(char*)malloc((len+1)*sizeof(char)); ТО пусть так и останется Ещё раз: malloc и realloc выделяют память под разные элементы. //+++++++++++++++++++++++++++++++++++++++ Напильник, я свои ошибки знаю и вижу. Пусть оно остаётся как есть. Ну так чё, кодер который не быдло? Выдашь на гора свой код или слив засчитан? Будем лепить левые отмазки типа "я умный и потому ни хрена давать не буду"? И я не говорил, что память нужно освобождать не free. Ну, кому надо, тот переспросит. А ты освобождай давай. Добавлено через 8 минут silent_1991,задумайтесь, стали бы вы инициализировать память, если она НЕ ВЫДЕЛЕНА? Автор возложил миссию выделения памяти на realloc (типа двух зайцев убивает сразу- и даные сохраняет и память увеличивает). Наверное, это не совсем грамотно. Но тем не менее- значит она и должна идти перед malloc, которая её инициализирует (загоняет туда строку). Короче, всё просто. Мяч круглый, поле квадратное. Пусть победит сильнейший. С Новым Годом! Добавлено через 11 минут Хотя прошу прощения, тс именно при первом проходе (до него) и использовал malloc для размещения указателя на первую строку
0
|
5056 / 3116 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
01.01.2011, 00:27 | 25 |
kravam, ага, сейчас глянул код, понял, в чём суть (раньше его вообще не смотрел, основывался только на вашем с Напильнегом споре). Память выделяется под указатель на строку (первую строку) до цикла, а затем, в цикле, выделяется и забивается память, указатель на которую был выделен ранее (на первой итерации - тот, что выделен до цикла, далее - тот, что перевыделен с помощью realloc). Так что с порядком следования вроде всё ок (сначала выделяется указатель на строку, затем выделяется и забивается эта строка и запасливо выделяется указатель на следующую строку). Единственное, я бы делал не так, я бы выделял кусок памяти под массив указателей на строки (скажем, штук под 10), а потом, при необходимости, увеличивал бы ранее выделенную память вдвое (собственно, стандартный подход).
На счёт освобождения памяти - так естественно сначала надо освободить память, выделенную под строки (с помощью free), а потом память, выделенную под массив указателей на них (с помощью того же free). Другого способа освобождения памяти, выделенной так, как выделяет ТС (да и любым другим способом) я не знаю... А вообще, если я пишу глупости, у меня есть оправдание - сегодня Новый год ! Всех с праздником!!!
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
|
|
01.01.2011, 01:03 | 26 |
Ну да, вообще там всё одинаково будет просто я память перераспределял с помощью realloc для заполнения её В ЭТОЙ же итерации, а он в следующей.
0
|
481 / 119 / 17
Регистрация: 30.09.2010
Сообщений: 473
|
|
01.01.2011, 02:29 | 27 |
Слава Богу, дошло до жирафа... А то я уж думал морду бить...
Повторяю для особо тупых - код цикла ввода из моего первого сообщения в теме ставишь в код, опубликованный ТС в первом сообщении вместо оригинального цикла ввода и прога становится рабочей с точностью до компилятора и возвращения выделенной динамической памяти.
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
|
|
01.01.2011, 09:37 | 28 |
см. подпись
1
|
481 / 119 / 17
Регистрация: 30.09.2010
Сообщений: 473
|
|
05.01.2011, 21:40 | 29 |
Ну да, укакавшись раз, пытаться зарамсить проблему по-чмошному, в личку, укакавшись еще раз, причем капитально и себе же на голову, поняв с помощью брата по разуму, на третьей странице обсуждения посмотревшему наконец в исходник, как хорошо укакался, что еще остается?
Конечно же, повесить на оппонента ярлык - спор то в чистую просран! См. подпись.
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
05.01.2011, 21:59 | 30 |
Во избежание флуда закрываю тему.
0
|
05.01.2011, 21:59 | |
05.01.2011, 21:59 | |
Помогаю со студенческими работами здесь
30
Преобразовать строку, удалив каждый символ * и повторив каждый символ, отличный от * Дана строка преобразовать ее удалив каждый символ * и повторив каждый символ отличный от символа *. Дана строка преобразовать ее удалив каждый символ * и повторив каждый символ отличный от символа * Дана строка. Преобразовать ее, удалив каждый символ (*) и повторив каждый символ, отличный от (*) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |