Partage
  • Partager sur Facebook
  • Partager sur Twitter

strcmp() en C++

fonction customisée

    28 mars 2008 à 17:59:39

    bonjour,

    j'étais entrain de tester ma fonction customisée de strcmp() quand mon compilo m'a sorti ça :

    invalid conversion form 'int' to 'char*'

    voila le code :

    1. char* ZString::comparer(char* chaine1, char* chaine2) //! strcmp custom
    2. {
    3.     int i;
    4.     for (i = 0; chaine1[i] == chaine2[i] ; i++)
    5.     {
    6.         if (chaine1[i] == '\0')
    7.         {
    8.             return 0;
    9.             return chaine1[i] - chaine2[i];
    10.         }
    11.     }
    12. }


    merci de m'aider
    • Partager sur Facebook
    • Partager sur Twitter
      28 mars 2008 à 18:01:29

      tu renvoies un entier alors que ta méthode est censée renvoyer un pointeur sur char :-° (et puis c'est quoi ces deux "return" à la suite ?)
      • Partager sur Facebook
      • Partager sur Twitter
        28 mars 2008 à 18:06:49

        faut juste que je mette int au lieu de char* alors ?Sinon pour les deux retours c'est comme ça que je l'ai codé maintenant que proposes tu à la place ?
        • Partager sur Facebook
        • Partager sur Twitter
          28 mars 2008 à 18:22:44

          Citation : darkangel75

          faut juste que je mette int au lieu de char* alors ?


          bah oui.

          Citation : darkangel75

          Sinon pour les deux retours c'est comme ça que je l'ai codé maintenant que proposes tu à la place ?


          tu penses faire quoi avec ce code ? car la fonction s'arrête au premier return rencontré donc ta fonction renvoie soit 0 soit une valeur indéterminée si chaine1 est différente de chaine2
          • Partager sur Facebook
          • Partager sur Twitter
            28 mars 2008 à 18:52:56

            Je me suis amusé à faire un strcmp aussi!

            Si tu n'y arrives pas tu pourras regarder. Attention, j'utilise les pointeurs à fond.


            1. // Les chaînes _doivent_ être terminées avec le caractères null '\0'
            2. int mon_strcmp( const char * g, const char * d )
            3. {
            4.     int cmp = 0;
            5.     while( cmp == 0 )
            6.     {
            7.         cmp = static_cast<int>(*g - *d);
            8.         if( *(g++) == '\0' || *(d++) == '\0' )
            9.             break;
            10.     }
            11.     return cmp;
            12. }
            • Partager sur Facebook
            • Partager sur Twitter
              28 mars 2008 à 19:14:44

              @ minirop : je l'utilisse pour la surcharge de l'opérateur '==' donc c'est bien pour ça qu'il me renvoie une valeur comme ça
              • Partager sur Facebook
              • Partager sur Twitter
                28 mars 2008 à 20:20:35

                Moi j'aime bien cette version:

                1. bool compare( const char * a, const char * b)
                2. {
                3.     while(*a++ == *b++ && *a !='\0' && *b!='\0'){}
                4.     return *a==*b;
                5. }
                • Partager sur Facebook
                • Partager sur Twitter
                Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                  29 mars 2008 à 10:17:15

                  dis donc elle est super condensée ta fonction ^^
                  • Partager sur Facebook
                  • Partager sur Twitter
                    29 mars 2008 à 12:01:15

                    Citation : Nanoc

                    Moi j'aime bien cette version:

                    1. bool compare( const char * a, const char * b)
                    2. {
                    3.     while(*a++ == *b++ && *a !='\0' && *b!='\0'){}
                    4.     return *a==*b;
                    5. }

                    Citation : darkangel75

                    dis donc elle est super condensée ta fonction ^^



                    Un peu trop ^^

                    1. std::cout << "compare(toto,titi) = " << compare("toto","titi") << std::endl;



                    compare(toto,titi) = 1

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
                      29 mars 2008 à 12:39:07

                      Ce code là fonctionne:

                      1. bool compare(const char* a,const char* b)
                      2. {
                      3.     for(; *a == *b && *a != '\0' && *b != '\0'; a++, b++)
                      4.         ;
                      5.     return *a == *b;
                      6. }
                      • Partager sur Facebook
                      • Partager sur Twitter
                        29 mars 2008 à 13:14:06

                        En effet... j'ai oublié le cas des chaines de meme longueur mais différentes.
                        1. bool compare( const char * a, const char * b)
                        2. {
                        3.     while(*a++ == *b++)
                        4.     {
                        5.         if(*a == '\0')
                        6.             return (*b=='\0');
                        7.         if(*b == '\0')
                        8.             return (*a=='\0');
                        9.     }
                        10.     return false;
                        11. }


                        Mais je suis convaincu qu'on peut faire plus court. Y a trop de tests inutiles là.
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                          29 mars 2008 à 13:22:14

                          Et le code que j'ai donné, tu l'as testé?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            29 mars 2008 à 13:59:56

                            Il est bon.
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                              29 mars 2008 à 14:43:07

                              @Nanoc : mauvaise analyse ;) ,ta fonction (la première version) ne marche pas non plus si le caractère suivant le premier caractère différent, est le même dans les deux chaines. Ta fonction dira que la chaine "at" est la même que "bt ou comment se faire pourrir par l'opérateur ++ :p ".

                              Il faut bien avouer que ce genre de chose n'est pas très lisible, il est très facile de se faire avoir :p

                              En passant, l'optimisation ultime (en nombre de caractères à taper) ne doit pas être très loin de ceci ...

                              1. bool compare(const char * a,const char * b)
                              2. {
                              3.    for(;*a==*b&&*a&&*b;a++,b++);
                              4.    return *a==*b;
                              5. }


                              En C++ comme en C d'ailleurs, 0 <=> false, != 0 = <=> true.

                              Tant qu'à faire dans l'illisible autant aller jusqu'au bout :p
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
                                29 mars 2008 à 14:47:36

                                En gros j'avais écrit sans le vouloir une fonction qui compare la taille de 2 chaines :)
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                                  29 mars 2008 à 15:21:20

                                  Citation : Nanoc

                                  En gros j'avais écrit sans le vouloir une fonction qui compare la taille de 2 chaines :)



                                  Pas vraiment ;)

                                  compare("ab","cb") => true
                                  compare("ab","cd") => false

                                  Ta fonction était beaucoup plus subtile que ça :p







                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
                                    29 mars 2008 à 15:29:54

                                    Alors j'ai fait une fonction qui sert à rien ! JUHUUU !!!
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                                      29 mars 2008 à 18:33:20

                                      Citation : int21h

                                      Citation : Nanoc

                                      En gros j'avais écrit sans le vouloir une fonction qui compare la taille de 2 chaines :)



                                      Pas vraiment ;)

                                      compare("ab","cb") => true
                                      compare("ab","cd") => false

                                      Ta fonction était beaucoup plus subtile que ça :p








                                      beaucoup plus subtile en effet mdrrrr
                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      strcmp() en C++

                                      × 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