Partage
  • Partager sur Facebook
  • Partager sur Twitter

La fonction strcpy

Je suis sur qu'on peu faire plus simple...

    28 juin 2006 à 1:42:35

    Bonjour, je suis actuellement en train de faire quelques exercices proposé dans le tutorial C/C++
    Et en fait je cherche un moyen plus simple que celui ci dessous pour effectuer une copie d'une chaine dans une autre !

    Voici mon code:
    ____________________________________________________________________
    Image utilisateur
    ____________________________________________________________________

    Je trouve beaucoup trop long de copié les caractères un à un, si quelqu'un pouvait m'éclairer, Merci
    • Partager sur Facebook
    • Partager sur Twitter
      28 juin 2006 à 1:55:01

      Fait le avec une boucle.
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        28 juin 2006 à 2:21:12

        J'y croit pas, un screen de code source :lol:
        On aura tout vu :D
        Je pense que copy/paste aurait été plus vite à faire nan? :p

        Sinon, pour te répondre, le seul moyen que je vois, c'est comme gagaro l'a dit, essais avec une boucle.

        EDIT: d'ailleur avec ton code, si on rajoutais un 's' à texte la fonction ne marcherait plus. ;)
        • Partager sur Facebook
        • Partager sur Twitter
          28 juin 2006 à 2:32:32

          Salut,

          comme dit gagaro, il faut faire une boucle.

          puis donner a ta fonction la taille de ton tableau(tailleTableau par exemple)

          de la tu fait

          void strcpy(char copieDeLaChaine[], char chaineACopier[], long tailleTableau)
          {
            long i;
           
            for(i=0; i<tailleTableau; i++)
            {
               copieDeLaChaine[i] = chaineACopier[i];
            }
          }


          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            28 juin 2006 à 2:40:14

            Citation : Golderack

            Salut,

            comme dit gagaro, il faut faire une boucle.

            puis donner a ta fonction la taille de ton tableau(tailleTableau par exemple)

            de la tu fait

            void strcpy(char copieDeLaChaine[], char chaineACopier[], long tailleTableau)
            {
              long i;
             
              for(i=0; i<tailleTableau; i++)
              {
                 copieDeLaChaine[i] = chaineACopier[i];
              }
            }





            Vaut mieux faire un strlen sur chaineACopier _dans_ la fonction strcpy pour avoir tailleTableau, ça evite de passer trois arguments à la fonction, et c'est plus rapide dans un programme où l'on dois l'utiliser souvent ;)
            • Partager sur Facebook
            • Partager sur Twitter
              28 juin 2006 à 2:54:55

              Citation : TheDead Master

              Citation : Golderack

              Salut,

              comme dit gagaro, il faut faire une boucle.

              puis donner a ta fonction la taille de ton tableau(tailleTableau par exemple)

              de la tu fait

              void strcpy(char copieDeLaChaine[], char chaineACopier[], long tailleTableau)
              {
                long i;
               
                for(i=0; i<tailleTableau; i++)
                {
                   copieDeLaChaine[i] = chaineACopier[i];
                }
              }





              Vaut mieux faire un strlen sur chaineACopier _dans_ la fonction strcpy pour avoir tailleTableau, ça evite de passer trois arguments à la fonction, et c'est plus rapide dans un programme où l'on dois l'utiliser souvent ;)



              ha ok, j'ai jamais fait un truc du genre mais ton astuce m'intrigue,

              strlen calcul la longueur de la chaine sans le '\0', jusque la c'est bon?

              donc ca ne marche pas, si tu copie la chaine sans le '\0'?

              a moin soit de le rajouter ou de faire appelle a cette fonction puis ajouter 1, es que c'est plus rapide?...

              EDIT:

              es que

              void strcpy(char copieDeLaChaine[], char chaineACopier[])
              {
                long i;
               
                for(i=0; chaineACopier!= '\0'; i++)
                {
                   copieDeLaChaine[i] = chaineACopier[i];
                }
              }

              ne serait pas pus simple?
              • Partager sur Facebook
              • Partager sur Twitter
                28 juin 2006 à 4:00:22

                Merci à tous pour vos réponses, j'en prendrais compte :)
                Et puis...on est tous débutant à un moment ou à un autre ;)

                BizouuuuXXXXX
                • Partager sur Facebook
                • Partager sur Twitter
                  28 juin 2006 à 4:08:52

                  void copie_chaine (const char *chaine, char *chaine_copie)
                  {
                      long longueur = strlen(chaine) + 1;
                      long i = 0;

                      for (i = 0 ; i < longueur ; i++)
                      {
                          chaine_copie[i] = chaine[i];
                      }
                  }
                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 juin 2006 à 4:32:52

                    c'est possible de faire ca?
                    void copie_chaine (const char *chaine, char *chaine_copie)
                    {
                        long i = 0;

                        for (i = 0 ; i < strlen(chaine) + 1 ; i++)
                        {
                            chaine_copie[i] = chaine[i];
                        }
                    }
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      28 juin 2006 à 10:24:01

                      Citation : TheDead Master

                      Vaut mieux faire un strlen sur chaineACopier _dans_ la fonction strcpy pour avoir tailleTableau, ça evite de passer trois arguments à la fonction, et c'est plus rapide dans un programme où l'on dois l'utiliser souvent



                      J'suis pas sûr que faire appelle à la fonction strlen à chaque fois soit plus rapide que de passer un paramètre...
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        28 juin 2006 à 11:07:51

                        Ou alors, le mieux est de se passer de strlen (qu'il soit au début de la fonction où dans la boucle, ce qui est pire) et de boucler tant que le caractère est différent de '\0'.
                        /* Copy source to dest. */
                        char *
                        my_strcpy(char *dest, const char *source)
                        {
                                while ((*dest++ = *source++))
                                        ;
                                *dest = '\0';
                                return (dest);
                        }
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          28 juin 2006 à 13:58:34

                          0zero0 => Par la j'entendais plus rapide à écrire le programme vu qu'on à pas à ce soucier de la taille du char et que de toute façon si il veut copier une chaine entrer par l'utilisateur, il sera obligé de connaitre sa taille ( donc faire un strlen pour passer la taille à la fonction ) .

                          louisclem => Le problème avec ta fonction c'est qu'elle est un peu compliquée pour un débutant :p
                          • Partager sur Facebook
                          • Partager sur Twitter
                            28 juin 2006 à 14:02:29

                            Citation : Golderack

                            c'est possible de faire ca?

                            void copie_chaine (const char *chaine, char *chaine_copie)
                            {
                                long i = 0;

                                for (i = 0 ; i < strlen(chaine) + 1 ; i++)
                                {
                                    chaine_copie[i] = chaine[i];
                                }
                            }


                            Je pense qu'il est plus correct de mettre (strlen(chaine) + 1) pour les priorités !
                            • Partager sur Facebook
                            • Partager sur Twitter
                              28 juin 2006 à 14:50:58

                              Ya plus simple:


                              void strcpy(char *Source, char *Destination)
                              {
                                  while(*(Destination++) = *(Source++));
                              }
                              • Partager sur Facebook
                              • Partager sur Twitter
                                28 juin 2006 à 16:23:18

                                Citation : Golderack

                                c'est possible de faire ca?

                                void copie_chaine (const char *chaine, char *chaine_copie)
                                {
                                    long i = 0;

                                    for (i = 0 ; i < strlen(chaine) + 1 ; i++)
                                    {
                                        chaine_copie[i] = chaine[i];
                                    }
                                }

                                Horrible et inutile. Il suffit de tester le 0 et d'ajouter une copie du 0 après la boucle...
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Music only !
                                  28 juin 2006 à 16:32:15

                                  En plus ça pose pas problème un strlen dans une fonction quand la chaine est envoyée comme paramètre (et donc pas déclaré dans la fonction !) ?
                                  Parce qu'en fait on envoie un pointeur je crois et pas vraiment la chaine en elle-même !
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Anonyme
                                    28 juin 2006 à 17:37:32

                                    Il faut éviter le strlen. D'abord parce qu'on en a pas besoin (on boucle sur le '\0'). Parce que si on met le strlen en condition de la boucle, on risque de le recalculer à chaque passage de boucle (inutile). Enfin il faut le faire sur la chaîne source, car la destination on ne connaît rien dessus elle peut être vide.

                                    Citation : Gravstein

                                    Ya plus simple:


                                    void strcpy(char *Source, char *Destination)
                                    {
                                        while(*(Destination++) = *(Source++));
                                    }

                                    Presque le même code que le miens sauf que celui-ci n'ajoute pas le '\0' et ne retourne pas l'adresse de la chaîne (comportement standard, elle doit retourner l'adresse de la chaîne copiée).

                                    je remets mon code dans la version sans pointeurs, normalement facile à comprendre :
                                    /* Copy source to dest. */
                                    char *
                                    my_strcpy(char *dest, const char *source)
                                    {
                                            int i;
                                            for (i = 0; source[i] != '\0'; ++i)
                                                    dest[i] = source[i];
                                            dest[i] = '\0';
                                            return (dest);
                                    }
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      28 juin 2006 à 20:27:40

                                      Citation : -ed-

                                      Citation : Golderack

                                      c'est possible de faire ca?

                                      void copie_chaine (const char *chaine, char *chaine_copie)
                                      {
                                          long i = 0;

                                          for (i = 0 ; i < strlen(chaine) + 1 ; i++)
                                          {
                                              chaine_copie[i] = chaine[i];
                                          }
                                      }


                                      Horrible et inutile. Il suffit de tester le 0 et d'ajouter une copie du 0 après la boucle...



                                      Comme je l'ai deja proposer ici non?

                                      Citation : Golderack

                                      es que

                                      Code : Cvoid strcpy(char copieDeLaChaine[], char chaineACopier[])
                                      {
                                      long i;

                                      for(i=0; chaineACopier!= '\0'; i++)
                                      {
                                      copieDeLaChaine[i] = chaineACopier[i];
                                      }
                                      }
                                      ne serait pas pus simple?



                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        28 juin 2006 à 20:55:59

                                        Citation : Golderack

                                        Citation : -ed-

                                        Horrible et inutile. Il suffit de tester le 0 et d'ajouter une copie du 0 après la boucle...


                                        Comme je l'ai deja proposer ici non?


                                        Il ne manque pas le 0 final ? Et un indice aussi... Il faut mieux compiler son code avant de le poster...


                                        {
                                           long i;

                                           for (i = 0; chaineACopier[i] != 0; i++)
                                           {
                                              copieDeLaChaine[i] = chaineACopier[i];
                                           }
                                           copieDeLaChaine[i] = 0;
                                        }

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Music only !
                                          28 juin 2006 à 23:20:17

                                          Bon je ne me permet pas pas d'émettre un doute sur ton code -ed- : mais y'a-t-il une différence entre '\0' et 0 à la fin d'une chaine ?
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            28 juin 2006 à 23:28:47

                                            j'ai toujours pas compris pourquoi on n'utilisait pas la fonction standart strcpy ? o_O
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              28 juin 2006 à 23:52:51

                                              Il cherchait à la recoder !
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                29 juin 2006 à 9:02:03

                                                Citation : Pierre89

                                                Bon je ne me permet pas pas d'émettre un doute sur ton code -ed- :


                                                Tu peux, et c'est même ton devoir.

                                                Citation : Pas de titre


                                                mais y'a-t-il une différence entre '\0' et 0 à la fin d'une chaine ?


                                                Aucune différence fonctionnelle. La différence est purement documentaire. Mais je suis un grand garçon et je sais que 0 est pareil que'\0'. (ça use moins le clavier).
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Music only !
                                                  29 juin 2006 à 10:50:32

                                                  Citation : louisclem

                                                  Citation : Gravstein

                                                  Ya plus simple:


                                                  void strcpy(char *Source, char *Destination)
                                                  {
                                                      while(*(Destination++) = *(Source++));
                                                  }


                                                  Presque le même code que le miens sauf que celui-ci n'ajoute pas le '\0' et ne retourne pas l'adresse de la chaîne (comportement standard, elle doit retourner l'adresse de la chaîne copiée).


                                                  Le caractère nul est bien recopié, dans la mesure ou l'affectation a lieu avant le test de poursuite de la boucle.

                                                  Ce code constitue, à mon avis, la meilleure solution. Quand à l'addresse de la chaîne, il suffit de rajouter un pointeur.

                                                  EDIT : Ceci dit on se paye un dépassement de tableau sur les 2 chaines, dans la mesure où les 2 pointeurs sont incrémentés même lorsque '\0' est rencontré.
                                                  C'était séduisant, mais...
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter

                                                  La fonction strcpy

                                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                  • Editeur
                                                  • Markdown