Преобразовать текст, удалив все ‘*’ и повторив дважды каждый символ, отличный от ‘*’ - C (СИ) (78935)
Формулировка задачи:
всем привет
народ помогите разобраться в чем ошибка, программа почему то печатает левое при наборе 3 и более строк
вот задание данное мне
Ввести массив строк символов (текст), которые могут содержать символы ‘*’. Преобразовать текст, удалив все ‘*’ и повторив дважды каждый символ, отличный от ‘*’.
в чем ошибка то? ничего не пойму, и вролде работает все норм но неправильно почему то, подскажите плиз оч надо
#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();
}
разве никто не знает в чем причина? что не так в моем коде то??
Решение задачи: «Преобразовать текст, удалив все ‘*’ и повторив дважды каждый символ, отличный от ‘*’»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 128
char** input(size_t* nrows)
{
if(nrows == NULL)
{
fprintf(stderr, "You must specify the pointer to store number of rows\n");
exit(1);
}
char** text = NULL;
char* buf;
size_t rows = 0;
puts("Input text (Ctrl+Z or Ctrl+D to stop):");
while(1)
{
buf = NULL;
if((buf = malloc(SIZE * sizeof(char))) == NULL)
{
fprintf(stderr, "Memory allocation failure\n");
exit(2);
}
if(fgets(buf, SIZE, stdin) == NULL)
{
if(feof(stdin))
break;
perror("getline");
exit(3);
}
++rows;
if((text = realloc(text, rows * sizeof(char*))) == NULL)
{
fprintf(stderr, "Memory allocation failure\n");
exit(4);
}
text[rows - 1] = buf;
};
*nrows = rows;
return text;
}
char* processrow(const char* row)
{
char* buf;
char* p;
// Символ '\n' дублировать не будем
if((buf = calloc(strlen(row) * 2, sizeof(char))) == NULL)
{
fprintf(stderr, "Memory allocation failure\n");
exit(5);
}
p = buf;
while(*row)
{
switch(*row)
{
case '*':
++row;
break;
case '\n':
*p++ = *row++;
break;
default:
*p++ = *row;
*p++ = *row++;
}
}
return buf;
}
int main()
{
size_t nrows, i;
char** text = input(&nrows);
printf("After processing:...\n");
for(i = 0; i < nrows; ++i)
{
char* buf = processrow(text[i]);
fputs(buf, stdout);
free(buf);
free(text[i]);
}
free(text);
exit(0);
}
Объяснение кода листинга программы
- Ввод текста, разделенного символом новой строки (Ctrl+Z или Ctrl+D для завершения ввода).
- Разбиение введенного текста на строки (при этом каждая строка сохраняется в отдельном блоке памяти).
- Проверка каждой строки на наличие символа '*'.
- Если символ '*' найден, то он пропускается, а все остальные символы дублируются.
- Вывод обработанных строк.
- Освобождение выделенной памяти.