Выделение памяти с помощью функции realloc - C (СИ)

Узнай цену своей работы

Формулировка задачи:

в общем задачка по сути своей вроде бы легкая, должна укладываться в 60 строчек, но что-то допереть не могу. Суть задания в том, что в у нас есть строка вида AB5CDE10. При выводе нам должно выйти ABBBBBCDEEEEEEEEEE, то есть если после чтения знака не следует десятичное число, знак копируем 1 раз до выходного ряда, если после чтение знака следует десятичное число, прочитаем это число N раз и до выхода скопируем этот самый знак N раз. Причем тут используется чтение кодов ASCII. Вот что до меня пока нашло, как это изобразить:
#ifndef __PROGTEST__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <assert.h>
#define MAX 1000000

#endif /* __PROGTEST__ */
 
char * RLEDecompress ( const char * src ){
    //char pole[10000];//*pole=(char*)malloc(sizeof(pole)*MAX);
    int kolvo=0;
    int i=0;
    while(src[kolvo]!=NULL){
        kolvo++;
    }
    for(i=0; i<kolvo; i++){
        if(src[i]<48 || src[i]>57){
            if(src[i+1]!='0'){
                printf("%c", src[i]);
            }
        }
        else {
            int cif=1;
            int cislo=0;
            cislo=src[i]-48;
            while (src[i+1]>=48 && src[i+1]<=57){
                cislo=0;
                cif++;
                i++;
            }
            if(cif>1){
                int step1=0, step2=1;
                int k=0, j=0, l=0;
                for (k=i; k>i-cif; k--){
                    for(j=0; j<step1; j++){
                        step2=step2*10;
                    }
                    cislo=cislo+(src[k]-48)*step2;
                    step1++;
                    step2=1;
                }
                for(l=0;l<cislo-1; l++){
                    printf("%c", src[i-cif]);
                }
 
            }
            if (cif==1) {
                int j = 0;
                for (j = 0; j < cislo - 1; j++) {
                    printf("%c", src[i - cif]);
                }
            }
        }
    }
    return 0;
 
}
 
#ifndef __PROGTEST__
int main ( int argc, char * argv [] )
{
    char * res=(char*)malloc(sizeof(char)* MAX);
 
    assert ( ! strcmp (
            (res = RLEDecompress ( "He4llo world!" )),
            "Hello world!" ));
    free ( res );
 
    assert ( ! strcmp (
            (res = RLEDecompress ( "Hello 30world!" )),
            "Hello                              world!" ));
    free ( res );
 
    assert ( ! strcmp (
            (res = RLEDecompress ( "Hel2o world!10" )),
            "Hello world!!!!!!!!!!" ));
    free ( res );
 
    assert ( ! strcmp (
            (res = RLEDecompress ( "H2e6l8o15 35w5o6r-2d0!" )),
            "HHeeeeeellllllllooooooooooooooo                                   wwwwwoooooor--!" ));
    free ( res );
 
    return 0;
}
#endif /* __PROGTEST__ */
то что в функции main было уже дано. осталось дело за малым-выделение памяти. Помогите с этим пожалуйста.

Решение задачи: «Выделение памяти с помощью функции realloc»

textual
Листинг программы
#ifndef __PROGTEST__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <assert.h>
 
 
#endif /* __PROGTEST__ */
 
char * RLEDecompress(const char * src){
    int kolvo = 0;
    int i = 0;
    int size = 100, p = -1;
    char *res1;
    res1 = (char *)malloc(size*sizeof(char));
    kolvo = strlen(src);
    for (i = 0; i<kolvo; i++){
        if (src[i]<48 || src[i]>57){
            if (src[i + 1] != '0'){
                p++;
                if (p == size - 2){
                    size *= 1.5;
                    res1 = (char *)realloc(res1, size*sizeof(char));
                    if (res1 == NULL) exit(1);
                }
                res1[p] = src[i];
            }
        }
        else {
            int cif = 1;
            int cislo = 0;
            cislo = src[i] - 48;
            while (src[i + 1] >= 48 && src[i + 1] <= 57){
                cislo = 0;
                cif++;
                i++;
            }
            if (cif>1){
                int step1 = 0, step2 = 1;
                int k = 0, j = 0, l = 0;
                for (k = i; k>i - cif; k--){
                    for (j = 0; j<step1; j++){
                        step2 = step2 * 10;
                    }
                    cislo = cislo + (src[k] - 48)*step2;
                    step1++;
                    step2 = 1;
                }
                for (l = 0; l<cislo - 1; l++){
                    p++;
                    if (p == size - 2){
                        size *= 1.5;
                        res1 = (char *)realloc(res1, size*sizeof(char));
                        if (res1 == NULL) exit(1);
                    }
                    res1[p] = src[i - cif];
                }
 
            }
            if (cif == 1) {
                int j = 0;
                for (j = 0; j < cislo - 1; j++) {
                    p++;
                    if (p == size - 2){
                        size *= 1.5;
                        res1 = (char *)realloc(res1, size*sizeof(char));
                        if (res1 == NULL) exit(1);
                    }
                    res1[p] = src[i - cif];
                }
            }
        }
    }
    res1[p + 1] = '\0';
    return res1;
}
 
#ifndef __PROGTEST__
int main(int argc, char * argv[])
{
    char * res;
    assert(!strcmp(
        (res = RLEDecompress("Hello world!")),
        "Hello world!"));
    free(res);
 
    assert(!strcmp(
        (res = RLEDecompress("Hello 30world!")),
        "Hello                              world!"));
    free(res);
 
    assert(!strcmp(
        (res = RLEDecompress("Hel2o world!10")),
        "Hello world!!!!!!!!!!"));
    free(res);
 
    assert(!strcmp(
        (res = RLEDecompress("H2e6l8o15 35w5o6r-2d0!")),
        "HHeeeeeellllllllooooooooooooooo                                   wwwwwoooooor--!"));
    free(res);
 
    return 0;
}
#endif /* __PROGTEST__ */

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

В данном коде реализована функция RLEDecompress, которая принимает на вход строку, закодированную по алгоритму RLE (Run-Length Encoding), и возвращает декодированную строку. Список действий, которые выполняются в коде:

  1. Инициализация переменных:
    • kolvo = 0;
    • i = 0;
    • size = 100;
    • p = -1;
    • res1 = (char )malloc(sizesizeof(char));
    • kolvo = strlen(src);
  2. Проход по исходной строке:
    • for (i = 0; i < kolvo; i++){
    • if (src[i]<48 || src[i]>57){
      • if (src[i + 1] != '0'){
      • p++;
      • if (p == size - 2){
        • size *= 1.5;
        • res1 = (char )realloc(res1, sizesizeof(char));
        • if (res1 == NULL) exit(1); }
      • res1[p] = src[i]; } }
    • else {
      • int cif = 1;
      • int cislo = 0;
      • cislo = src[i] - 48;
      • while (src[i + 1] >= 48 && src[i + 1] <= 57){
      • cislo = 0;
      • cif++;
      • i++; }
      • if (cif>1){
      • int step1 = 0, step2 = 1;
      • int k = 0, j = 0, l = 0;
      • for (k = i; k>i - cif; k--){
        • for (j = 0; j<step1; j++){
        • step2 = step2 * 10; }
        • cislo = cislo + (src[k] - 48)*step2;
        • step1++;
        • step2 = 1; }
      • for (l = 0; l<cislo - 1; l++){
        • p++;
        • if (p == size - 2){
        • size *= 1.5;
        • res1 = (char )realloc(res1, sizesizeof(char));
        • if (res1 == NULL) exit(1); }
        • res1[p] = src[i - cif]; } }
      • if (cif == 1) {
      • int j = 0;
      • for (j = 0; j < cislo - 1; j++) {
        • p++;
        • if (p == size - 2){
        • size *= 1.5;
        • res1 = (char )realloc(res1, sizesizeof(char));
        • if (res1 == NULL) exit(1); }
        • res1[p] = src[i - cif]; } } }
  3. Добавление завершающего нулевого символа в декодированную строку:
    • res1[p + 1] = '\0';
  4. Возврат декодированной строки:
    • return res1; В функции main() производится тестирование функции RLEDecompress на нескольких примерах. В случае успешного завершения функции, строка, переданная в качестве аргумента, сравнивается с результатом декодирования этой же строки функцией RLEDecompress. Если строки совпадают, то выводится сообщение об успешном прохождении теста. Затем, с помощью функции free(), освобождается память, выделенная под результат декодирования.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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