Bonjour à tous,
Voudriez-vous me dire comment appeler strlcat?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 char * x = "Hello, w."; char x1 [16]= "Hello, world."; strlcat (x1, x+2, 2); printf("%s\n", x1);
JPD
Bonjour à tous,
Voudriez-vous me dire comment appeler strlcat?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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)
Raymond
Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi
CafuroCafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
e-verbeUn logiciel de conjugaison des verbes de la langue française.
Ma page personnelle sur DVP.
[CODE]
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part for(; *r != '\0'; r++)
EDIT :
sizeof(x) correspond à la taille du tableau et non pas d'un seul char.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 char x []= "Hello, world."; char *r = malloc(30 * sizeof(x));
Il faut remplacer la ligne par :
Code : Sélectionner tout - Visualiser dans une fenêtre à part 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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:
Si, la boucle modifie bien p, mais pas ce qui est dedans. (ouf)
Pour vous, c'est plus facile d'apprendre C?
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
Envoyé par http://www.manpagez.com/man/3/strlcat/
Pour obtenir le résultat attendu, utilise plutôt strncat.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.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
Partager