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