Copie char * en c

hoff -  
fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   -
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 ?
Configuration: Windows 7
Firefox 3.5.5

3 réponses

  1. nobie-cs Messages postés 157 Statut Membre 17
     
    tu peut faire sa "char* ss = fonctionquiretournlepionteur() " :) pas trop sure
    0
  2. Pacorabanix Messages postés 4122 Date d'inscription   Statut Membre Dernière intervention   663
     

    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
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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
      1. hoff > fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention  
         
        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
      2. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847 > hoff
         
        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
      3. Pacorabanix Messages postés 4122 Date d'inscription   Statut Membre Dernière intervention   663 > fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention  
         
        ok noté :P
        0
  3. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    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