Преобразовать текст, удалив все ‘*’ и повторив дважды каждый символ, отличный от ‘*’ - 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);
}

Объяснение кода листинга программы

  1. Ввод текста, разделенного символом новой строки (Ctrl+Z или Ctrl+D для завершения ввода).
  2. Разбиение введенного текста на строки (при этом каждая строка сохраняется в отдельном блоке памяти).
  3. Проверка каждой строки на наличие символа '*'.
  4. Если символ '*' найден, то он пропускается, а все остальные символы дублируются.
  5. Вывод обработанных строк.
  6. Освобождение выделенной памяти.

Оцени полезность:

6   голосов , оценка 3.667 из 5
Похожие ответы