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
Bonjour,

j'ai 2 char * s et ss, s est donné par une fonction dont on sait juste qu'elle retourne l'adresse d'un char *

j'utilise strcpy (y a t il mieux dans ce cas ???)

pour l'initialisation de ss, je recupere la taille avec strlen, dois-je multiplier la taille par 4 pour l'allocation ?
A voir également:

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
tu peut faire sa "char* ss = fonctionquiretournlepionteur() " :) pas trop sure
0
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

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)
0
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
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
0
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
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 ?
0
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
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
0
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
ok noté :P
0
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
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
0