C strcat dynnamique

a marqué ce sujet comme résolu.

Bonjour, voila mon soucis, je voudrais concatener une chaine à d’autre de manniere dynamique :

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


char* concat () {
        char src[50], *dest;
        dest = malloc(10 * sizeof(char));
        strcpy(src,  "data");

        int i =0,j;
        int nbgen=rand()%20+10;
        for (i=0,j=0; i<=nbgen; i++) {
                strcat(dest+j, src);
                strcat(dest, ",");
                j = strlen(dest);
        }
        dest[j]= '\0';
        return dest ;
}
int main () {
        char * ret = NULL;
        concat();
        printf("Final destination string : %s \n", ret = concat());
        free(ret);
        return 0;
}

J’ai actuellement une erreur Memory map car l’allocation que j’ai faite est trop petite, et c’est justement ma question, comme allouer ma ma variable *dest dynamiquement ?

actuellement la solution de contournement que j’ai trouvé d’allouer le tableau *10000

1
dest = malloc(1000 * sizeof(char));

j’aimerais un truc plus propre. on part du princique que l’on ne connais pas la valeur int nbgen, qui peut varier de 1 à + l’infini.

+0 -0

Euh …
J’ai du mal à comprendre la question …

1
dest = malloc(nbgen + 1);

?

Peut-être que le problème est que l’allocation doit se faire avant de connaître nbgen ? Ou que nbgen varie et que le tableau doit adapter sa taille ?
Si c’est le cas, alors tu peux utiliser realloc pour l’utiliser, tape man realloc dans un terminal (ou dans ton moteur de recherche favoris).

+0 -0

Déjà il y a beaucoup d’incohérence dans ton code, ça peut empêcher une bonne compréhension et rend plus dur les modifications o_O

Pourquoi tu appelle 2 fois la fonction concat() ? (possible fuite de mémoire)

1
2
3
char * ret = NULL;
concat();
printf("Final destination string : %s \n", ret = concat());

Il serait plus judicieux de faire:

1
2
3
char * ret = concat();
printf("Final destination string : %s \n", ret);
free(ret);

Avant ta boucle for, tu initialise i et dans ta boucle tu initialise j sans l’utiliser dans les instructions de for:

1
2
3
4
5
6
7
int i =0,j;
int nbgen=rand()%20+10;
for (i=0,j=0; i<=nbgen; i++) {
    strcat(dest+j, src);
    strcat(dest, ",");
    j = strlen(dest);
}

Essaye de passer à ça pour plus de clarté:

1
2
3
4
5
6
7
int j = 0;
int nbgen=rand()%20+10;
for (int i=0; i<=nbgen; i++) {
    strcat(dest+j, src);
    strcat(dest, ",");
    j = strlen(dest);
}

Tout cela n’aide pas trop à résoudre ton problème mais c’est déjà plus simple à regarder. Ensuite @ache a raison, la taille de la chaîne de caractères que retourne ta fonction concat() dépend du nombre de fois que ta boucle for est exécutée. Donc tu dois agir en conséquence en comprenant combien de caractères tu ajoute à chaque tour de boucle.

Tu devrais avoir quelque chose comme ça : dest = malloc(nb_de_caractères * sizeof(char));, ou peut-être ça: (si j’ai bien compris ton code, vu que tu n’a pas explicitement dis ce que ta fonction veut faire, ni pourquoi tu veux afficher aléatoirement plein de "data,")

dest = malloc(nbgen * (strlen(src) + 1) * sizeof(char));.

Voilà ce que jeu peux faire pour toi, mais si tu veux plus d’aide, il va falloir nous donner plus d’information.

+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