Bonjour à tous,
Voudriez-vous me dire comment appeler strlcat?
Code:
1
2
3
4
5 char * x = "Hello, w."; char x1 [16]= "Hello, world."; strlcat (x1, x+2, 2); printf("%s\n", x1);
JPD
Version imprimable
Bonjour à tous,
Voudriez-vous me dire comment appeler strlcat?
Code:
1
2
3
4
5 char * x = "Hello, w."; char x1 [16]= "Hello, world."; strlcat (x1, x+2, 2); printf("%s\n", x1);
JPD
Je ne suis pas sûr de comprendre ce que tu veux faire.
L'aide de strlcat est ici (entre autre)
[CODE]Code:
1
2
3
4
5
6 char * x = "Hello, word."; char x1 [14]= "Hello, world."; int i = strlcat (x1, x+7, 19); printf("%d -%s-\n", i, x1);
18 -Hello, world.word.-
CODE]
Ça s'appelle comme ça?
JPD
J'essaie de comprendre strlcat.
J'ai un problème de malloc avec le Ä en trop au début
J'obtiens:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 int main(void) { char x []= "Hello, world."; char *r = malloc(30 * sizeof(x)); strlcat (r, x, 9); strlcat (r , x+7, 15); for(; *r != '\0'; r++) printf("%c-", *r); printf("\n"); return 0; }
Ä-H-e-l-l-o-,- -w-o-r-l-d-.-
r et x doivent être des chaînes de caractères C, c'est à dire terminées par un '\0'Code:
1
2
3 char *r = malloc(30 * sizeof(x)); strlcat (r, x, 9);
C'est le cas de x.
Pour r, le buffer contient n'importe quoi mais la fonction va chercher un '\0' dedans et finir par en trouver un (ou ça va planter). Elle ajoutera les caractères derriere ce qui donnera un début de chaîne erronné.
C'est la même chose pour strcat.
Code:
1
2
3 char *r = malloc(30 * sizeof(x)); *r = '\0'; strlcat (r, x, 9);
De plus, c'est pas bon du tout de modifier la valeur d'un pointeur qui stocke l'adresse renvoyée par malloc. Car cette valeur doit, plus tard, être utilisée pour libérer la mémoire allouée, en utilisant free.Code:for(; *r != '\0'; r++)
EDIT :
sizeof(x) correspond à la taille du tableau et non pas d'un seul char.Code:
1
2 char x []= "Hello, world."; char *r = malloc(30 * sizeof(x));
Il faut remplacer la ligne par :
Code:char *r = malloc(30 * sizeof(*r));
Si, la boucle modifie bien r, mais pas ce qui est dedans (ouf)
Contournement : Ne pas travailler sur r mais sur une copie :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 int main(void) { char x []= "Hello, world."; char *r = malloc(30 * sizeof *r ); char *p; *r = '\0'; strlcat (r, x, 9); strlcat (r , x+7, 15); p = r; for(; *p != '\0'; p++) printf("%c-", *p); printf("\n"); free(r); return 0; }
Alors là, c'est grand merci.
/*Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 int main(void) { char x []= "Hello, world."; char *r = malloc(30 * sizeof *r ); char *p; *r = '\0'; strlcat (r, x, 9); printf("%d-",strlen( r)); strlcat (r , x+8, 15); printf("%d-\n",strlen( r)); strlcat (r, x, 6); printf("%d-\n", strlen( r)); p = r; for(; *p != '\0'; p++) printf("%c-", *p); printf("\n"); free(r); return 0; }
8-13-
13-
H-e-l-l-o-,- -w-o-r-l-d-.-
*/
Pourquoi je n'ai pas H-e-l-l-o-,- -w-o-r-l-d-.-H-e-l-l-o-,- ?
Je sens qu'on va me répondre quelque chose du genre:
Citation:
Si, la boucle modifie bien p, mais pas ce qui est dedans. (ouf)
Pour vous, c'est plus facile d'apprendre C?
:oops:
JPD
Fait le test : le pointeur r est modifié, la chaine pointée par r ne l'est pas.
Le code suivant crashe, pourtant, la boucle ne modifie pas la chaine de caractères :
Sinon, le dernier paramètre de strlcat n'est pas la taille de se qu'on veut copier, mais la taille du buffer de destination.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 int main(void) { char *r = malloc(30); strcpy(r, "Hello"); printf("r: %p\n", r); for(; *r != '\0'; ++r) { printf("%c-", *r); } printf("\n"); printf("r: %p\n", r); free(r); return 0; }
Citation:
Envoyé par http://www.manpagez.com/man/3/strlcat/
Pour obtenir le résultat attendu, utilise plutôt strncat.Code:
1
2
3
4
5
6
7 /* strlen(r) vaut 0, size 9 --> copie au max 8 caractères */ strlcat (r, x, 9); /* strlen(r) vaut 8, size 15 --> copie au max 6 caractères */ strlcat (r , x+8, 15); /* strlen(r) vaut 13, size 6 --> copie 0 caractère */ strlcat (r, x, 6);
Ici ça ne crash pas.Citation:
Fait le test : le pointeur r est modifié, la chaine pointée par r ne l'est pas.
Le code suivant crashe, pourtant, la boucle ne modifie pas la chaine de caractères :
"C:\MinGW\bin\gcc.exe" -W -Wall -mconsole -Wno-missing-braces -o tstptr tstPtr.c
>tstptr
r: 002C1790
H-e-l-l-o-
r: 002C1795