Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/22: Рейтинг темы: голосов - 22, средняя оценка - 4.73
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194

Преобразовать текст, удалив все ‘*’ и повторив дважды каждый символ, отличный от ‘*’

30.12.2010, 21:45. Показов 4442. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
всем привет
народ помогите разобраться в чем ошибка, программа почему то печатает левое при наборе 3 и более строк
вот задание данное мне
Ввести массив строк символов (текст), которые могут содержать символы ‘*’. Преобразовать текст, удалив все ‘*’ и повторив дважды каждый символ, отличный от ‘*’.
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
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
char *out;
char **vvod()
{
clrscr();
char **txt, size[128];
txt=NULL;
int len=-1;
   txt=(char**)malloc(sizeof(char*));
for (int i=0; len!=0; i++)
 {
   gets(size);
   len=strlen(size);
 
   txt[i]=(char*)malloc((len+1)*sizeof(char));
   strcpy(txt[i], size);
      txt=(char**)realloc(txt,(i+1)*sizeof(char*));
 }
return txt;
}
 
char *copysim(char *text)
{
char *out;
int n;
n=strlen(text);
out=(char*)malloc(((2*n)+1)*sizeof(char));
for(int i=0, j=0;  i<n&&j<(2*n); i++)
 {
   if (text[i]!='*')
   {
     out[j]=text[i];
     j++;
     out[j]=text[i];
     j++;
   }
 }
 out[j]=0;
return out;
}
 
void main()
{
char **text;
text=vvod();
for (int i=0; strlen(text[i])!=0; i++)
{
out=copysim(text[i]);
printf("%s", out);
}
getch();
 
}
в чем ошибка то? ничего не пойму, и вролде работает все норм но неправильно почему то, подскажите плиз оч надо

Добавлено через 3 часа 24 минуты
разве никто не знает в чем причина? что не так в моем коде то??
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.12.2010, 21:45
Ответы с готовыми решениями:

Преобразовать текст, удалив все ‘*’ и повторив дважды каждый символ, отличный от ‘*’
всем привет. Дано такое задание.. Ввести массив строк символов (текст), которые могут содержать символы ‘*’. Преобразовать текст,...

Дана строка. Преобразовать ее, удалив каждый символ (*) и повторив каждый символ, отличный от (*)
напишите пожалуйста решение задачи и к нему СКРИН ну или хотя бы вот эту задачу напишите В символьном массиве хранятся фамилии и...

Преобразовать строку, удалив каждый символ * и повторив каждый символ, отличный от *
Собственно задание Дана строка. Преобразовать ее, удалив каждый символ * и повторив каждый символ, отличный от * Собственна...

29
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
31.12.2010, 20:41
Студворк — интернет-сервис помощи студентам
Вот твой код
C++
1
2
3
4
5
6
7
8
9
for (int i=0; len!=0; i++)
  {
    gets(size); len=strlen(size);
 
    txt[i]=(char *)malloc((len+1)*sizeof(char));
    strcpy(txt[i], size);
    if (len>0)
      txt=(char **)realloc(txt,(i+2)*sizeof(char *));
  }
Так вот. Идиотизм это при первом проходе инициализировать указатель переменную char*
адресом памяти из восьми байт.
Ведь
C++
1
(i+2)*sizeof(char *) это 8 байт
При этом в первых четырё байтах будет храниться адрес нулевой строки.
В последующих четырёх неизвестно что. Это круто, наверное.
Заносим в массив char* значение и четыре байта к массиву приплюсовываем. Чтобы были.

И да: сперва выделяем память. Потом инициализируем. С утра так было.

Выделяет память (В ДАННОМ КОДЕ под указатели на char) функция realloc
Инициализирует её (опять же в данном коде malloc ). ПРивет

И да: при использовании realloc КРАЙНЕ НЕ СОВЕТУЮ освобождать память free.
Если кто спросит почему- отвечу. Напильнику не беспокоиться. Он пусть освобождает.

Он, наверное щас занят написанием РАБОЧЕГО кода, а то языком трепать все могут.





Ну и соответственнто

Добавлено через 3 минуты
Короче, жду данных, на который мой код спотыкается.
0
481 / 119 / 17
Регистрация: 30.09.2010
Сообщений: 473
31.12.2010, 22:06
Цитата Сообщение от kravam Посмотреть сообщение
Вот твой код
C++
1
2
3
4
5
6
7
8
  for (int i=0; len!=0; i++)
  {
    gets(size); len=strlen(size);
    txt[i]=(char *)malloc((len+1)*sizeof(char));
    strcpy(txt[i], size);
    if (len>0)
      txt=(char **)realloc(txt,(i+2)*sizeof(char *));
  }
Так вот. Идиотизм это при первом проходе инициализировать указатель переменную char*
адресом памяти из восьми байт.
Это не мой код - это мое исправление к исходному коду, которое надо вставить вместо родного цикла. А полностью комплекс мероприятий по обеспечению работоспособности цикла ввода тогда будет выглядеть так:
C++
1
2
3
4
5
6
7
8
9
10
  int len=-1;
  txt=(char**)malloc(sizeof(char*));
  for (int i=0; len!=0; i++)
  {
    gets(size); len=strlen(size);
    txt[i]=(char *)malloc((len+1)*sizeof(char));
    strcpy(txt[i], size);
    if (len>0)
     txt=(char **)realloc(txt,(i+2)*sizeof(char *));
  }
Думаю, объяснения тут не нужны.

Не очень кузяво, сам бы я написал по другому, но ТС хочет разобраться в ошибках в своем коде, вот я и внес минимальные изменения с сохранением исходной концепции.

Цитата Сообщение от kravam Посмотреть сообщение
И да: при использовании realloc КРАЙНЕ НЕ СОВЕТУЮ освобождать память free.
В Си есть другой способ освобождения памяти? Цитатник идиотизмов резко пополняется.

Цитата Сообщение от kravam Посмотреть сообщение
Он, наверное щас занят написанием РАБОЧЕГО кода, а то языком трепать все могут.
После внесения предложенных мной изменений исходный код становится рабочим (под Борманом). Некомпилируемость под другими компиляторами обусловлена другим фрагментом, исправляется движением мизинца, ты сам сказал как.

Добавлено через 12 минут
Цитата Сообщение от kravam Посмотреть сообщение
Короче, жду данных, на который мой код спотыкается.
А надо? Такое использование глобальных переменных уже позволяет квалифицировать его как быдлокод.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
31.12.2010, 22:55
kravam, эммм... Я не особо вникал в код... Но из моего опыта malloc выделяет память (т.е. берёт память из кучи и возвращает указатель типа void на её начало), а realloc перевыделяет память, выделенную ранее с помощью malloc или calloc. Освободить выделенную (или перевыделенную) память можно с помощью free.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
31.12.2010, 23:38
Цитата Сообщение от silent_1991 Посмотреть сообщение
kravam, эммм... Я не особо вникал в код...
А надо было бы.
Дело в том, что если Вы посмотрите внимательно, то увидите, в каждом проходе malloc выделяет память под массив символов.

C++
1
txt[i]=(char*)malloc((len+1)*sizeof(char));
ибо txt[i] содержит указатель на массив символов.
Ну то есть введено, допустим "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 для размещения указателя на первую строку
C++
1
   txt=(char**)malloc(sizeof(char*));
Всё верно.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
01.01.2011, 00:27
kravam, ага, сейчас глянул код, понял, в чём суть (раньше его вообще не смотрел, основывался только на вашем с Напильнегом споре). Память выделяется под указатель на строку (первую строку) до цикла, а затем, в цикле, выделяется и забивается память, указатель на которую был выделен ранее (на первой итерации - тот, что выделен до цикла, далее - тот, что перевыделен с помощью realloc). Так что с порядком следования вроде всё ок (сначала выделяется указатель на строку, затем выделяется и забивается эта строка и запасливо выделяется указатель на следующую строку). Единственное, я бы делал не так, я бы выделял кусок памяти под массив указателей на строки (скажем, штук под 10), а потом, при необходимости, увеличивал бы ранее выделенную память вдвое (собственно, стандартный подход).
На счёт освобождения памяти - так естественно сначала надо освободить память, выделенную под строки (с помощью free), а потом память, выделенную под массив указателей на них (с помощью того же free). Другого способа освобождения памяти, выделенной так, как выделяет ТС (да и любым другим способом) я не знаю...
А вообще, если я пишу глупости, у меня есть оправдание - сегодня Новый год ! Всех с праздником!!!
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
01.01.2011, 01:03
Цитата Сообщение от silent_1991 Посмотреть сообщение
kravam, ага, сейчас глянул код, понял, в чём суть (раньше его вообще не смотрел, основывался только на вашем с Напильнегом споре).
Ну да, вообще там всё одинаково будет просто я память перераспределял с помощью realloc для заполнения её В ЭТОЙ же итерации, а он в следующей.
0
481 / 119 / 17
Регистрация: 30.09.2010
Сообщений: 473
01.01.2011, 02:29
Цитата Сообщение от kravam Посмотреть сообщение
Хотя прошу прощения, тс именно при первом проходе (до него) и использовал malloc для размещения указателя на первую строку
C++
1
txt=(char**)malloc(sizeof(char*));
Всё верно.
Слава Богу, дошло до жирафа... А то я уж думал морду бить...

Цитата Сообщение от kravam Посмотреть сообщение
Ну так чё, кодер который не быдло? Выдашь на гора свой код или слив засчитан?
Будем лепить левые отмазки типа "я умный и потому ни хрена давать не буду"?
Повторяю для особо тупых - код цикла ввода из моего первого сообщения в теме ставишь в код, опубликованный ТС в первом сообщении вместо оригинального цикла ввода и прога становится рабочей с точностью до компилятора и возвращения выделенной динамической памяти.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
01.01.2011, 09:37
см. подпись
1
481 / 119 / 17
Регистрация: 30.09.2010
Сообщений: 473
05.01.2011, 21:40
Цитата Сообщение от kravam Посмотреть сообщение
см. подпись

2) Игнорирую быдло. Напильника, в частности.
Ну да, укакавшись раз, пытаться зарамсить проблему по-чмошному, в личку, укакавшись еще раз, причем капитально и себе же на голову, поняв с помощью брата по разуму, на третьей странице обсуждения посмотревшему наконец в исходник, как хорошо укакался, что еще остается?
Конечно же, повесить на оппонента ярлык - спор то в чистую просран!

См. подпись.
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
05.01.2011, 21:59
Во избежание флуда закрываю тему.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.01.2011, 21:59

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

Преобразовать строку, удалив каждый символ * и повторив каждый символ, отличный от *
Дана строка. Преобразовать ее, удалив каждый символ * и повторив каждый символ, отличный от *.

Дана строка преобразовать ее удалив каждый символ * и повторив каждый символ отличный от символа *.
помогите одним задачем Дана строка преобразовать ее удалив каждый символ * и повторив каждый символ отличный от символа *. ...

Дана строка преобразовать ее удалив каждый символ * и повторив каждый символ отличный от символа *
Дана строка преобразовать ее удалив каждый символ * и повторив каждый символ отличный от символа *.

Дана строка. Преобразовать ее, удалив каждый символ (*) и повторив каждый символ, отличный от (*)
Дана строка. Преобразовать ее, удалив каждый символ (*) и повторив каждый символ, отличный от (*) пример: #include &lt;stdio.h&gt; ...


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

Или воспользуйтесь поиском по форуму:
30
Закрытая тема Создать тему
Новые блоги и статьи
Нейтральные знания ..., ... чистая наука. Пока что-то проходит модерацию на Хабре, стоит развить мысль ...
Hrethgir 20.07.2026
К таким радикальным взглядам я конечно в той публикации не приходил, но чтобы скоротать вечер, решил углубиться немного. 1. Почему показания термометра заряжены целью? Цель заложена в самом. . .
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ По ссылке 403. Не очень информативно такую ссылку постить. Запись от Usaga размещена Сегодня в 06:46 . . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru