Partage
  • Partager sur Facebook
  • Partager sur Twitter

Création fonction "string.h" !!!

La fonction de copie ?

Sujet résolu
    24 août 2006 à 10:04:12

    Bonjour, tout est dit dans le titre ! Je ne comprend pas quoi ma fonction que j'ai créer pour copier du texte ne fonctionne pas !

    La voici :

    char* copchai(char copieDeLaChaine[], const char texteACopier[]);
    {
            long quelLettre = 0;
            for (quelLettre = 0 ; copieDeLaChaine != texteACopier ; quelLettre++)
            {
                    copieDeLaChaine[quelLettre] = texteACopier[quelLettre];
            }
    }


    Merci pour vos réponce !
    • Partager sur Facebook
    • Partager sur Twitter
      24 août 2006 à 10:09:15

      Salut. Plusieurs petis problèmes.

      Tu compares un long à un const char. De plus ta fonction est censée renvoyer un char * or elle ne renvoie rien du tout. Pour parcourir une chaîne, je te conseillerai une boucle :

      int i = 0;
      while (texteACopier[i] != '\0')
      {

      ++i;
      }
      • Partager sur Facebook
      • Partager sur Twitter
        24 août 2006 à 10:24:08

        J'ai modifier, mon code comme ceci :

        char* copchai(char copieDeLaChaine[], const char texteACopier[]);
        {
                int i = 0;
                while (texteACopier[i] != '\0')
                {
                        copieDeLaChaine[i] = textACopier[i];
                        ++i;
                }

                return copieDeLAChaine;
        }


        Mais j'ai toujours les mêmes erreurs !

        Les voici :

        Citation : erreur

        --------------------Configuration: mesFoncStin - Win32 Debug--------------------
        Compiling...
        myfonction.c
        C:\Documents and Settings\Maison\Mes documents\progr\mesFoncStin\myfonction.c(18) : error C2449: found '{' at file scope (missing function header?)
        C:\Documents and Settings\Maison\Mes documents\progr\mesFoncStin\myfonction.c(27) : error C2059: syntax error : '}'
        Error executing cl.exe.

        myfonction.obj - 2 error(s), 0 warning(s)

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          24 août 2006 à 10:29:30

          Salut,
          Tu as mis un point virgule après les parenthèses. Il ne faut pas. Le point virgule se place uniquement lors de la déclaration du prototype de la fonction, pas lors de l'implémentation.
          • Partager sur Facebook
          • Partager sur Twitter
            24 août 2006 à 10:32:13

            ah, oui j'avais pas vu !

            En plus il y a des erreurs d'écriture !!! Aussi, donc j'ai reussi a tout resoudre !! Merci a tous
            • Partager sur Facebook
            • Partager sur Twitter
              24 août 2006 à 10:37:15


              Citation : Pas de titre

              char* copchai(char copieDeLaChaine[], const char texteACopier[]);
              {
              . . .
              }



              Il n'y a pas de point-virgule

              • Partager sur Facebook
              • Partager sur Twitter
                24 août 2006 à 10:40:48

                Tu peux aussi incrémenter directement les pointeurs :
                char *strcpy(char *cible, const char *source)
                {
                    char *ret = cible;
                    while(*source)
                    {
                        *cible = *source;
                        cible++;
                        source++;
                    }
                    *cible = '\0';

                    return ret;
                }
                • Partager sur Facebook
                • Partager sur Twitter
                  24 août 2006 à 10:50:53

                  Ou, lala, j'ai rien comprit !!!! Il y a plein de pointeur partout !!! JE comprend pas comment sa marche ??

                  J'ai un autre problème !!!
                  C'est pour la "concaténer" !!!

                  Voici mon code :

                  char* copcont(char chaine1[], const char chaine2[])
                  {
                          int j = 0, a = 0;
                          while (chaine1[j] != '\0')
                          {
                                  j++;
                          }

                          while (chaine1 != chaine1 + chaine2)
                          {
                                  chaine1[j] = chaine1[j] + chaine2[a];
                                  a++;
                          }

                          return chaine1;
                  }


                  A la compilation j'ai deux erreurs !

                  Personne ?...
                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 août 2006 à 12:23:55

                    Citation : remram44

                    Tu peux aussi incrémenter directement les pointeurs :

                    char *strcpy(char *cible, const char *source)
                    {
                        char *ret = cible;
                        while(*source)
                        {
                            *cible = *source;
                            cible++;
                            source++;
                        }
                        *cible = '\0';

                        return ret;
                    }


                    Ok bast17 je vais t'expliquer, c'est pas habituelle pour un débutant mais ça évite des déclarations de variables qui servent presque pas !

                    Déjà il déclare un pointeur ret = cible car une fois qu'on à incrémenté cible on peut plus le retrouner (c'est plus la bonne adresse) !

                    Ensuite on dis : tant que *source existe (donc != de 0 [ 0 = '\0' dans une chaine])...
                    alors *cible est égale à *source !
                    Jusque là rien de compliqué par contre ce qui suis il faut le comprendre :
                    cible contient l'adresse des valeurs en mémoire de la chaine cible, si on fait cible++ on passe de cible[0] à cible[1] car les valeurs sont stocké 'en bloc' elles ne sont pas éparpillées (voir cours M@teo21).
                    On fait de même pour source !

                    On sort de la boucle et on rajoute un '\0' à cible (vu qu'on c'est arrêté au moment de *source = '\0' on n'a pas copier le '\0' dans cible)

                    On retourne ret pour avoir un pointeur sur le premier élément du tableau je rappelle que ret = cible avant la boucle dont ret pointe sur la première case du tableau de départ !


                    J'édite pour concatchaine !
                    //dans le genre remram c'est pratique !
                    char *concat (char *s1, char *s2)
                    {
                       char *ret = s1;
                       while (*s1)
                       {
                          s1++;
                       }

                       while (*s2)
                       {
                         *s1 = *s2;
                         s1++;
                         s2++;
                       }
                       *s1 = '\0';

                       return ret;
                    }


                    Ca devrait marcher (et ça fait travailler les pointeurs !)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 août 2006 à 14:45:16

                      On peut même encore réduire le code de pierre89 même si ça peut en désarmer certains. Personnellement j'aime bien être bref... :-°

                      char *concat (char *s1, char *s2)
                      {
                         char *ret = s1;
                         
                         while (*s1++)
                             ;
                         while (*s1++ = *s2++)
                             ;
                         *s1 = '\0';

                         return ret;
                      }


                      Ca paraît un peu hard au début mais avec l'habitude on s'y fait :)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        24 août 2006 à 20:28:55

                        Oké, je viens enfin de comprendre, après 4 lecture lol !!! Mais bon j'ai comprit c'est le principal !!! Merci Pierre89 .
                        • Partager sur Facebook
                        • Partager sur Twitter
                          25 août 2006 à 2:11:57

                          Pour ce qui concerne la copie de chaine, vous ecrivez des codes beaucoup trop longs :
                          #include <stdio.h>

                          void copie (char from[]; char to[])
                          {
                              int i;
                              for(i = 0 : from[i] = to[i] ; i++);
                          }

                          En admettant que '\0' est egal a 0 (ce qui est le cas presque tout le temps)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            25 août 2006 à 22:31:27

                            Citation : Koral

                            Pour ce qui concerne la copie de chaine, vous ecrivez des codes beaucoup trop longs :

                            #include <stdio.h>

                            void copie (char from[]; char to[])
                            {
                                int i;
                                for(i = 0 : from[i] = to[i] ; i++);
                            }


                            En admettant que '\0' est egal a 0 (ce qui est le cas presque tout le temps)



                            #include <stdio.h>

                            void cpy(char *s, char *t)
                            {
                                while(*s++ = *t++)
                                    ;
                            }


                            Gagné :D
                            • Partager sur Facebook
                            • Partager sur Twitter
                              26 août 2006 à 1:57:23

                              C'est bien beau de réduire la taille de ses codes.
                              Mais essayons de leur donner un sens plus ou moins logique...
                              Eviter les petites erreurs d'étourderie aussi ca sert bien... surtout quand on post pour répondre à quelqu'un qui n'est pas forcement capable de les trouver seul.

                              En gros il faut à peu pret éviter ça :

                              Citation : Koral

                              void copie (char from[]; char to[])
                              {
                              int i;
                              for(i = 0 : from[i] = to[i] ; i++);
                              }

                              • Partager sur Facebook
                              • Partager sur Twitter
                                26 août 2006 à 1:59:29

                                Citation : Koral

                                En admettant que '\0' est egal a 0 (ce qui est le cas presque tout le temps)


                                Ce qui est toujours le cas !

                                Citation : lexou


                                C'est bien beau de réduire la taille de ses codes.
                                Mais essayons de leur donner un sens plus ou moins logique...
                                <...>


                                void copie (char from[]; char to[])
                                {
                                int i;
                                for(i = 0 : from[i] = to[i] ; i++);
                                }


                                De plus : Le séparateur de paramètres, c'est ',' et non ';'... T'en as d'autres comme ça ? (genre ':' au lieu de ';' !!!). Faudrait peut être arréter de taper n'importe quoi...

                                Il est conseillé d'utiliser 'const' à bon escient pour qualifier un des paramètres (source, par exemple, genre 'from'). Ca, ça évite les erreurs...
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Music only !

                                Création fonction "string.h" !!!

                                × 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