Copie char * en c
Fermé
hoff
-
24 nov. 2009 à 23:25
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 25 nov. 2009 à 23:43
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 25 nov. 2009 à 23:43
A voir également:
- Copie char * en c
- Copie cachée - Guide
- Copie écran samsung - Guide
- Super copie - Télécharger - Gestion de fichiers
- Copie disque dur - Guide
- Coco char - Accueil - Réseaux sociaux
3 réponses
nobie-cs
Messages postés
155
Date d'inscription
samedi 21 novembre 2009
Statut
Membre
Dernière intervention
15 mai 2010
17
24 nov. 2009 à 23:31
24 nov. 2009 à 23:31
tu peut faire sa "char* ss = fonctionquiretournlepionteur() " :) pas trop sure
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
661
24 nov. 2009 à 23:31
24 nov. 2009 à 23:31
j'utilise strcpy (y a t il mieux dans ce cas ???)
très bien. C'est fait exactement pour ça.
pour l'initialisation de ss, je recupere la taille avec strlen, dois-je multiplier la taille par 4 pour l'allocation ?
ne suppose jamais que les type de donnée ont une certaine valeur fixe !
Il faudrait en effet multiplier, mais par sizeof(char). Dans le cas particulier du char je crois mais je ne suis pas sûr qu'il n'y a pas besoin de multiplier. Ceci dit c'est quand même plus clair, à mon avis, avec le *sizeof(char).
Enfin, attention, n'oublie pas de laisser une place au caractère 0 de fin de chaine... Il n'est pas compté dans strlen si mes souvenirs sont bons ! (à vérifier)
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
24 nov. 2009 à 23:45
24 nov. 2009 à 23:45
Enfin, attention, n'oublie pas de laisser une place au caractère 0 de fin de chaine... Il n'est pas compté dans strlen si mes souvenirs sont bons ! (à vérifier)
Effectivement mais c'est même pire que ça. strlen copie jusqu'au \0 sans se poser de question.
C'est pour ça qu'il vaut mieux utiliser strncpy et poser manuellement le \0 en fin de chaîne.
Cdlt
Effectivement mais c'est même pire que ça. strlen copie jusqu'au \0 sans se poser de question.
C'est pour ça qu'il vaut mieux utiliser strncpy et poser manuellement le \0 en fin de chaîne.
Cdlt
hoff
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
24 nov. 2009 à 23:57
24 nov. 2009 à 23:57
si je comprend bien j'alloue comme ca
ss = malloc(sizeof(char)*strlen(s)+1);
ensuite je copie
strncpy(ss,s,sizeof(char)*strlen(s));
dois-je ensuite rajouter le caractere de fin ??? ou bien se met il autmatiquement ?
ss = malloc(sizeof(char)*strlen(s)+1);
ensuite je copie
strncpy(ss,s,sizeof(char)*strlen(s));
dois-je ensuite rajouter le caractere de fin ??? ou bien se met il autmatiquement ?
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
>
hoff
25 nov. 2009 à 23:43
25 nov. 2009 à 23:43
Oui il faut rajouter le caractère de fin manuellement. Il se met automatiquement uniquement s'il y a de la place.
Et un autre conseil, n'oublie pas après l'allocation de tester si ss est NULL ou pas. Si ss est NULL (erreur d'allocation) t'auras des segfaults dans la suite du programme.
Cdlt
Et un autre conseil, n'oublie pas après l'allocation de tester si ss est NULL ou pas. Si ss est NULL (erreur d'allocation) t'auras des segfaults dans la suite du programme.
Cdlt
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
661
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
24 nov. 2009 à 23:57
24 nov. 2009 à 23:57
ok noté :P
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
24 nov. 2009 à 23:43
24 nov. 2009 à 23:43
sizeof(char) = 1 puisqu'un char est un byte (au moins 8 bits).
Au choix du programmeur de le mettre. Vraiment une question d'habitude.
char *ss=fct(...); peut suffit si la fonction se charge d'allouer la zone dans le heap.
Tu peux aussi allouer le buffer avant d'appeler la fonction. Et la fonction remplira le buffer à passer en paramètre.
N'oublie pas de vider la zone allouée via free.
Pour strcpy, je te conseille de l'oublier et de plutôt utiliser strncpy. Cela te permet de contrôler la taille et d'éviter des buffer overflows.
Cdlt
Au choix du programmeur de le mettre. Vraiment une question d'habitude.
char *ss=fct(...); peut suffit si la fonction se charge d'allouer la zone dans le heap.
Tu peux aussi allouer le buffer avant d'appeler la fonction. Et la fonction remplira le buffer à passer en paramètre.
N'oublie pas de vider la zone allouée via free.
Pour strcpy, je te conseille de l'oublier et de plutôt utiliser strncpy. Cela te permet de contrôler la taille et d'éviter des buffer overflows.
Cdlt