0 / 0 / 0
Регистрация: 05.10.2014
Сообщений: 31
1

Выделение памяти с помощью функции realloc

04.12.2014, 16:10. Показов 1675. Ответов 7
Метки нет (Все метки)

в общем задачка по сути своей вроде бы легкая, должна укладываться в 60 строчек, но что-то допереть не могу. Суть задания в том, что в у нас есть строка вида AB5CDE10. При выводе нам должно выйти ABBBBBCDEEEEEEEEEE, то есть если после чтения знака не следует десятичное число, знак копируем 1 раз до выходного ряда,
если после чтение знака следует десятичное число, прочитаем это число N раз и до выхода скопируем этот самый знак N раз. Причем тут используется чтение кодов ASCII. Вот что до меня пока нашло, как это изобразить:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#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 было уже дано. осталось дело за малым-выделение памяти. Помогите с этим пожалуйста.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.12.2014, 16:10
Ответы с готовыми решениями:

Динамическое выделение для массива структур. Программа вылетает без ошибок на использовании функции realloc
Здесь код: ссылка В массив структур нужно записать новый элемент, выделить для него память....

Выделение памяти в отдельной функции
Вот функция и указатель, который объявлен глобально. Вопрос: если не вызывать функцию, память...

Выделение памяти в отдельной функции
Помогите выделить память в отдельной функции и очистить тоже Язык Си вот выделяется так в...

Выделение памяти в отдельной функции
Как эти 3 строчки занести в отдельную функцию a = (double **)malloc(n*sizeof(double)); b =...

7
11 / 11 / 9
Регистрация: 24.10.2013
Сообщений: 48
05.12.2014, 02:11 2
Я это сделал примерно так:
C
1
2
3
    int size = 100,k=-1;
    char *res1, *tmp;
    res1 = (char *)malloc(size*sizeof(char));
Потом вместо каждого printf пишем что то типа:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
k++;
if (k == size - 2){
    size *= 1.5;
    tmp = (char *)realloc(res1, size*sizeof(char));
    if (tmp != NULL){
        res1 = tmp;
    }   
    else {
        free(res1);
        exit(1);
    }
}
res1[k] = src[i];
Лучше всего это конечно засунуть в еще одну функцию что бы не нагромождать код.

Ну и в конечном итоге мы возвращаем из функции не 0, а
C
1
return res1;
0
Диссидент
Эксперт C
27329 / 17050 / 3767
Регистрация: 24.12.2010
Сообщений: 38,404
05.12.2014, 10:48 3
Tatatatitata, вместо этого
C
1
2
3
4
tmp = (char *)realloc(res1, size*sizeof(char));
    if (tmp != NULL){
        res1 = tmp;
    }
Можно писать просто
C
1
2
res1 = (char *)realloc(res1, size*sizeof(char));
    if (res1 == NULL) exit(1);
Anastasiia_Kh, Это
C
1
2
3
while(src[kolvo]!=NULL){
        kolvo++;
    }
можно смело заменить на
C
1
kolvo = strlen(src);
1
0 / 0 / 0
Регистрация: 05.10.2014
Сообщений: 31
05.12.2014, 15:16  [ТС] 4
Цитата Сообщение от Tatatatitata Посмотреть сообщение
Потом вместо каждого printf пишем что то типа:
Код C

C
1
2
3
4
5
6
7
8
9
10
11
12
13
k++;
if (k == size - 2){
    size *= 1.5;
    tmp = (char *)realloc(res1, size*sizeof(char));
    if (tmp != NULL){
        res1 = tmp;
    }   
    else {
        free(res1);
        exit(1);
    }
}
res1[k] = src[i];
спасибо большое, но я не совсем поняла роль k и почему оно у вас перед if сначала выполняет k++?
0
11 / 11 / 9
Регистрация: 24.10.2013
Сообщений: 48
05.12.2014, 18:24 5
С помощью k мы записываем результат в массив res1.
Для первой буквы мы увеличиваем к на 1 и записываем эту букву в res1[0], для каждых последующих букв мы проверяем если res1[k] не будет выходить за пределы массива, если выходит, то добавляем память с помощь функции реалок. Наверное это можно записать немного красивее, но это первое что пришло мне в голову.
0
0 / 0 / 0
Регистрация: 05.10.2014
Сообщений: 31
06.12.2014, 16:36  [ТС] 6
Tatatatitata, получается применимо к моей программе это дело все будет выглядеть так, да?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#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);
                        else {
                            free(res1);
                            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);
                        else {
                            free(res1);
                            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);
                        else {
                            free(res1);
                            exit(1);
                        }
                    }
                    res1[p] = src[i-cif];
                }
            }
        }
    }
    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__ */
0
11 / 11 / 9
Регистрация: 24.10.2013
Сообщений: 48
06.12.2014, 16:53 7
Лучший ответ Сообщение было отмечено Anastasiia_Kh как решение

Решение

Ну почти, во первых в строчке 23 вы забыли заменить принтф, во вторых вы смешали то что изначально написал и то что мне посоветовали и в итоге получилось так, что у вас программа по любому закончится на реалоке, ну и в третьих нужно перед тем как вернуть строку, добавить "\0". Вот в общем готовый вариант:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#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__ */
1
0 / 0 / 0
Регистрация: 05.10.2014
Сообщений: 31
06.12.2014, 19:09  [ТС] 8
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#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);
                    else {
                        free(res1);
                        exit(1);
                    }
                }
                res1[p] = src[i];
               // printf("%c", res1[p]);
            }
        }
        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);
                        else {
                            free(res1);
                            exit(1);
                        }
                    }
                    res1[p] = src[i-cif];
                    //printf("%c", res1[p]);
                }
 
            }
            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);
                        else {
                            free(res1);
                            exit(1);
                        }
                    }
                    res1[p] = src[i-cif];
                   // printf("%c", res1[p]);
                }
            }
        }
    }
    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__ */
Добавлено через 1 минуту
немного исправила, но почему о он не правильно 3 пример выводит, хотя когда пишу printf, то вывод правильный.

Добавлено через 2 часа 12 минут
Tatatatitata, Спасибо вам огромное!!!!!! Работает!! правда с есть один пример который данная программа не выводит
C
1
2
3
4
assert(!strcmp(
            (res = RLEDecompress ( "1234" )),
            "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"));
    free(res);
но в остальном все хорошо!)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.12.2014, 19:09
Помогаю со студенческими работами здесь

Выделение динамической памяти внутри функции
приветствую. Изучаю С, для лушчего усвоения изобретаю велосипед - попылатся реализовать собственный...

Динамическое выделение памяти в отдельной функции
Здрасьте! Мне необходимо динамически выделить память в отдельной функции, заполнить ее, и...

Выделение памяти массиву структур в функции
Добрый день. Программа работает с записями, в виде массива структур: #define STRLENGTH 20 ...

Выделение памяти под массив в отдельной функции
#include&lt;stdio.h&gt; #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; void memory(int **a,int n,int m); void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru