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

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

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

Author24 — интернет-сервис помощи студентам
всем привет
народ помогите разобраться в чем ошибка, программа почему то печатает левое при наборе 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.12.2010, 21:45
Ответы с готовыми решениями:

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

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

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

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

29
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
31.12.2010, 20:41 21
Author24 — интернет-сервис помощи студентам
Вот твой код
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 22
Цитата Сообщение от 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
Эксперт С++
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
Цитата Сообщение от 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
Эксперт С++
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
Цитата Сообщение от silent_1991 Посмотреть сообщение
kravam, ага, сейчас глянул код, понял, в чём суть (раньше его вообще не смотрел, основывался только на вашем с Напильнегом споре).
Ну да, вообще там всё одинаково будет просто я память перераспределял с помощью realloc для заполнения её В ЭТОЙ же итерации, а он в следующей.
0
481 / 119 / 17
Регистрация: 30.09.2010
Сообщений: 473
01.01.2011, 02:29 27
Цитата Сообщение от kravam Посмотреть сообщение
Хотя прошу прощения, тс именно при первом проходе (до него) и использовал malloc для размещения указателя на первую строку
C++
1
txt=(char**)malloc(sizeof(char*));
Всё верно.
Слава Богу, дошло до жирафа... А то я уж думал морду бить...

Цитата Сообщение от kravam Посмотреть сообщение
Ну так чё, кодер который не быдло? Выдашь на гора свой код или слив засчитан?
Будем лепить левые отмазки типа "я умный и потому ни хрена давать не буду"?
Повторяю для особо тупых - код цикла ввода из моего первого сообщения в теме ставишь в код, опубликованный ТС в первом сообщении вместо оригинального цикла ввода и прога становится рабочей с точностью до компилятора и возвращения выделенной динамической памяти.
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
Цитата Сообщение от kravam Посмотреть сообщение
см. подпись

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

См. подпись.
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
05.01.2011, 21:59 30
Во избежание флуда закрываю тему.
0
05.01.2011, 21:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.01.2011, 21:59
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
30
Закрытая тема Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru