Выделение памяти с помощью функции realloc - C (СИ)
Формулировка задачи:
в общем задачка по сути своей вроде бы легкая, должна укладываться в 60 строчек, но что-то допереть не могу. Суть задания в том, что в у нас есть строка вида AB5CDE10. При выводе нам должно выйти ABBBBBCDEEEEEEEEEE, то есть если после чтения знака не следует десятичное число, знак копируем 1 раз до выходного ряда,
если после чтение знака следует десятичное число, прочитаем это число N раз и до выхода скопируем этот самый знак N раз. Причем тут используется чтение кодов ASCII. Вот что до меня пока нашло, как это изобразить:
то что в функции main было уже дано. осталось дело за малым-выделение памяти. Помогите с этим пожалуйста.
#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__ */
Решение задачи: «Выделение памяти с помощью функции 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), и возвращает декодированную строку. Список действий, которые выполняются в коде:
- Инициализация переменных:
- kolvo = 0;
- i = 0;
- size = 100;
- p = -1;
- res1 = (char )malloc(sizesizeof(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, 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]; } } }
- Добавление завершающего нулевого символа в декодированную строку:
- res1[p + 1] = '\0';
- Возврат декодированной строки:
- return res1; В функции main() производится тестирование функции RLEDecompress на нескольких примерах. В случае успешного завершения функции, строка, переданная в качестве аргумента, сравнивается с результатом декодирования этой же строки функцией RLEDecompress. Если строки совпадают, то выводится сообщение об успешном прохождении теста. Затем, с помощью функции free(), освобождается память, выделенная под результат декодирования.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д