Выделение памяти с помощью функции 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(), освобождается память, выделенная под результат декодирования.