strcat dynnamique

a marqué ce sujet comme résolu.

Bonjour, je me retrouve confronté face à un problème, je pense que mon problème c’est de faire l’allocation dynamique d’un string

j’ai une chaine de caractere t2 et je voudrais faire des strcat dessus de manière dynamique (10,100 fois…)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main () {
    char t1[40];
    char t2[100];
    int i=0;

    while (i<=100) {
        strcpy(t1, "This is test");
        strcat(t1,"\n");
        strcat(t2,t1);
        i++;
    }

   printf("%s", t2);
   return(0);
}

Je voudrais que mon tableau t2 ai une taille non statique et donc supprimé cette ligne : char t2[100];

+0 -0

Salut,

Salut \o,

Il existe un tuto sur ce site même à propos de l’allocation dynamique justement :D

ache

Yep. :)
Cela étant, je me demande s’il ne manque pas un exemple de gestion d’allocation dynamique pour le cas d’une zone qui est amenée à être étendue régulièrement. Je veux dire, on présente bien realloc, mais je pense qu’un petit exercice serait le bienvenue pour appronfondir son utilisation.

Or, ceci est justement un bon exercice. :D
Je met une solution puisque l’exercice est actuellement manquant dans le tuto (à regarder après avoir essayé). ;)

 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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int
main(void)
{
        char *str = "This is a test\n";
        size_t size = 64;
        char *mem = malloc(size);

        if (mem == NULL) {
                perror("malloc");
                exit(EXIT_FAILURE);
        }

        *mem = 0;

        for (unsigned i = 0; i < 100; ++i) {
                size_t total = strlen(mem) + strlen(str) + 1;

                if (size < total) {
                        size_t newsize = (total & ~1U) << 1;
                        char *tmp = realloc(mem, newsize);

                        if (tmp == NULL) {
                                perror("realloc");
                                exit(EXIT_FAILURE);
                        }

                        mem = tmp;
                        size = newsize;
                }

                strcat(mem, str);
        }

        printf("size: %zu\n%s\n", size, mem);
        return 0;
}
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte