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
Petit Malin
"accélérateur . . . qui pousse . . . un électron a passer par deux trous d’un écran en même temps." (Cyrille Burt: "C’est mieux qu’un fantôme") (Janus p.251)
"Joy is to love what is, pain is to love what is not" )
HP Pavilion Elite Desktop PC 570-p0xx - Window10 64 bits - Intel(R) Core(TM)2 Quad CPU Q8200 @ 3GHz x86_64-w64-mingw32-gcc-7.3.0.exe
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
Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
e-verbe Un 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
Petit Malin
"accélérateur . . . qui pousse . . . un électron a passer par deux trous d’un écran en même temps." (Cyrille Burt: "C’est mieux qu’un fantôme") (Janus p.251)
"Joy is to love what is, pain is to love what is not" )
HP Pavilion Elite Desktop PC 570-p0xx - Window10 64 bits - Intel(R) Core(TM)2 Quad CPU Q8200 @ 3GHz x86_64-w64-mingw32-gcc-7.3.0.exe
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-.-
Petit Malin
"accélérateur . . . qui pousse . . . un électron a passer par deux trous d’un écran en même temps." (Cyrille Burt: "C’est mieux qu’un fantôme") (Janus p.251)
"Joy is to love what is, pain is to love what is not" )
HP Pavilion Elite Desktop PC 570-p0xx - Window10 64 bits - Intel(R) Core(TM)2 Quad CPU Q8200 @ 3GHz x86_64-w64-mingw32-gcc-7.3.0.exe
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);
Publication : Concepts en C
Mon avatar : Glenn Gould
--------------------------------------------------------------------------
Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
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));
Petit Malin
"accélérateur . . . qui pousse . . . un électron a passer par deux trous d’un écran en même temps." (Cyrille Burt: "C’est mieux qu’un fantôme") (Janus p.251)
"Joy is to love what is, pain is to love what is not" )
HP Pavilion Elite Desktop PC 570-p0xx - Window10 64 bits - Intel(R) Core(TM)2 Quad CPU Q8200 @ 3GHz x86_64-w64-mingw32-gcc-7.3.0.exe
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
Petit Malin
"accélérateur . . . qui pousse . . . un électron a passer par deux trous d’un écran en même temps." (Cyrille Burt: "C’est mieux qu’un fantôme") (Janus p.251)
"Joy is to love what is, pain is to love what is not" )
HP Pavilion Elite Desktop PC 570-p0xx - Window10 64 bits - Intel(R) Core(TM)2 Quad CPU Q8200 @ 3GHz x86_64-w64-mingw32-gcc-7.3.0.exe
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
Petit Malin
"accélérateur . . . qui pousse . . . un électron a passer par deux trous d’un écran en même temps." (Cyrille Burt: "C’est mieux qu’un fantôme") (Janus p.251)
"Joy is to love what is, pain is to love what is not" )
HP Pavilion Elite Desktop PC 570-p0xx - Window10 64 bits - Intel(R) Core(TM)2 Quad CPU Q8200 @ 3GHz x86_64-w64-mingw32-gcc-7.3.0.exe
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager