[C++] concatenation char*+char*

Résolu
Bonjour,

Je me suis bloqué sur cette methode:

Chaine Chaine::operator+(const Chaine &c){
             Chaine n;
             n.longueur=longueur+c.longueur;
             n.ch=new char[n.longueur];
             for(int i=0;i<n.longueur;i++)
             n.ch=ch[i]+c.ch[i];
             return n;
             }


main:

int main(int argc, char *argv[])
{
    int egalite;
    Chaine c("bla"),r("blo");
    Chaine t;
    t=c+r;
    t.affichage();
    system("PAUSE");
    return EXIT_SUCCESS;
}


Ou est l'erreur SVP .

merci
Configuration: Windows XP
Firefox 3.0.5

12 réponses

  1. c'est quoi ton erreur quand tu compile ?

    n.longueur=longueur+c.longueur;
    longueur n'est pas initialisé.
    --
    Mieux vaut se taire et passer pour un con, que de l'ouvrir et ne laisser aucun doute sur le sujet . 
    mais pourquoi je fais jamais ce que je dis moi ....
    0
    1. Contributeur
      Salut
      Tu as mis : n.ch=ch[i]+c.ch[i];
      Essaie plutôt :
      n.ch[i]=ch[i]+c.ch[i];

      Sinon, si c'est pas ça, précise ton message d'erreur exact.
      0
      1. j'ai pas de message d'erreur, il m'affiche la petite fenetre noire de l'execution, mais à la place d'afficher la chaine concatené , il affiche des caracteres speciaux, et ça lorsque j'ai ajouté un cout dans la methode:

        Chaine Chaine::operator+(const Chaine &c){
                     Chaine n;
                     n.longueur=longueur+c.longueur;
                     n.ch=new char[n.longueur];
                     for(int i=0;i<n.longueur;i++)
                     n.ch[i]=ch[i]+c.ch[i];
                     cout<<n.ch;
                     return n;
                     }


        pour tester d'abords le contenu de la chaine
        0
      2. Contributeur
        @progfannAh oui, j'ai mal lu ton code.
        Tu fais une addition de char. Normal que tu obtiennes n'importe quoi.
        La concaténation, c'est rajouter les caractères à la suite de l'autre.
        Donc une boucle for, pour copier les caractères de la première chaîne, et une autre boucle for pour copier les caractères à la suite de la deuxième.
        Sachant, que tu as la fonction strncpy et strncat qui existe qui font ça à ta place.
        Sinon je te propose pas le type String, je pense que c'est ce que tu veux recoder ^^.
        0
    2. j'ai essayé la fonction strcat ça marchait, mais avec un cout dans la methode operator+, le probleme maintenant dans le main:

      int main(int argc, char *argv[])
      {
          int egalite;
          Chaine c("bla"),r(" blo");
          Chaine t;
          t=c+r; //
       
          system("PAUSE");
          return EXIT_SUCCESS;
      }


      sachant que j'ai definit un constructeur par defaut (sans arguments)

      et la nouvelle mathode operator+:
      Chaine Chaine::operator+(const Chaine &c){
                   Chaine n;
                   n.longueur=longueur+c.longueur;
                   n.ch=new char[n.longueur];
                   strcpy(n.ch,strcat(ch,c.ch));
                   
                   return n;
                   }


      erreur:
      In function `int main(int, char**)': 
      no matching function for call to `Chaine::Chaine(Chaine)' 
       candidates are: Chaine::Chaine(Chaine&) 
      Chaine::Chaine(char*) 

      0
      1. Contributeur
        Déjà tu pourrais coder le constructeur par recopie, ça t'éviterait l'utilisation de strncpy.
        Sinon, essaie :

        Chaine Chaine::operator+(const Chaine &a){
            Chaine r;
            r.longueur=a.longueur+Chaine::longueur;
            r.ch=new char[r.longueur+1];
            strncpy(r.ch,Chaine::ch,r.longueur);
            strncat(r.ch,a.ch,r.longueur);
            return r;
        }
        

        J'ai mis r.n+1 en supposant que tu n'as pas compté le '\0' dans longueur.
        0
        1. toujours cette erreur:
          In function `int main(int, char**)': 
          no matching function for call to `Chaine::Chaine(Chaine)' 
           candidates are: Chaine::Chaine(Chaine&) 
          Chaine::Chaine(char*) 

          dans le main:
          int main(int argc, char *argv[])
          {
              int egalite;
              Chaine c("bla"),r(" blo");
              Chaine t;
              t=c+r;
              
          
              system("PAUSE");
              return EXIT_SUCCESS;
          }
          0
          1. Aidez moi SVP
            0
          2. Contributeur
            Pourrais-tu poster ton constructeur par recopie ?
            0
        2. Chaine::Chaine(Chaine &c){
                                      longueur=c.longueur;
                                    ch=new char[longueur+1];
                                    strcpy(ch,c.ch); 
                                      }
          0
          1. Contributeur
            Ok, donc je pense que le problème vient du fait que tu n'as définit : Chaine(char*).
            Vu que tu fais Chaine a("coucou"); le compilateur va chercher le constructeur avec comme argument un char*. S'il n'existe pas, il va chercher celui s'y rapprochant le plus comme (Chaine(Chaine)). Mais, ça va pas lui plaire d'où le message d'erreur.
            0
            1. j'ai tout essayé, constructeur sans/avec arguments, celui de recopie, mais toujours meme probleme..meme erreur..:s:s:s

              int main(int argc, char *argv[])
              {
                  
                  int egalite;
                  Chaine c("bla"),r(" blo");
                  Chaine z("titi");
                  z=c+r;  // LA OU IL ME SIGNAL L'ERREUR
                  //cout<<;
                  
              
                  system("PAUSE");
                  return EXIT_SUCCESS;
              }
              0
              1. Contributeur
                Oups, j'ai mal lu le message d'erreur. Apparemment c'est que tu n'as pas le constructeur Chaine(Chaine)
                Tu as juste Chaine(Chaine&) et Chaine(char*).
                0
                1. Peut être que c'est un problème d'affectation, non??
                  Chaine c("bla"),r(" blo");
                  Chaine z;
                  z=c+r;
                  
                  0
              2. Contributeur
                Poste tout ton code. Le .h, le .cpp de la classe ainsi que ton Main. Enlève tout ce qui a de superflu.
                T'inquiète, on va la chopper l'erreur ;)
                0
                1. Problème de constructeur de recopie, si je l'élimine tout marche bien, si je le garde --->les erreurs

                  Classe Chaine.h:

                  class Chaine{
                        private:
                                int longueur;
                                char *ch;
                        public:
                               Chaine();
                               Chaine(char*);
                               //Chaine(Chaine&);
                               ~Chaine();
                               void affichage();
                               Chaine& operator=(const Chaine&);
                               Chaine operator+(const Chaine&);           
                        };


                  Classe Chaine.cpp:
                  Chaine::Chaine(){
                                         longueur=0;
                                         ch=NULL;
                                         }
                        Chaine::Chaine(char *c){
                                            longueur=strlen(c)+1;
                                            ch=new char[longueur];
                                            strcpy(ch,c);
                                            }
                        /*Chaine::Chaine(Chaine &c){
                                              longueur=c.longueur;
                                            ch=new char[longueur+1];
                                            strcpy(ch,c.ch); 
                                              }*/
                        Chaine::~Chaine(){
                                          if(ch)
                                          delete[] ch;
                                          }
                        void Chaine::affichage(){
                             cout<<"Votre chaine est :"<<ch<<endl;
                             }
                        Chaine& Chaine::operator=(const Chaine &c){
                                if(ch)
                                delete[] ch;
                                ch=new char[longueur+1];
                                strcpy(ch,c.ch);
                                
                                return *this;
                                }
                    
                        Chaine Chaine::operator+(const Chaine &c){
                               Chaine n;
                               n.longueur=longueur+c.longueur;
                               n.ch=new char[n.longueur+1]; //ou +2 puisque j'ai 2 chaines "ché pa"
                               strcpy(n.ch,strcat(ch,c.ch));
                               
                               return n;
                               }


                  L'inconvénient de strcat c'est qu'il modifie la chaine initiale(ch) on ajoutant le c.ch
                  Par exemple si j'ai 2 chaines a("hello"); et b(" world"); donc aprés le a+b; automatiquement a devient: a("hello world"). Dans ce cas si j'ai crée une autre instance Chaine c; et je fais c=a+b; le resultat est toujours "hello world", ce qui explique b n'est pas lu ==>operator+ est desactivé juste l'affectation qui marche là. Bon voila mon main:

                  int main(int argc, char *argv[])
                  {
                      Chaine c("bla"),r(" blo"),k;
                      
                      k=c+r;
                      
                      c.affichage();
                     
                      system("PAUSE");
                      return EXIT_SUCCESS;
                  }
                     


                  p.s. j'ai pas ecris les includes et les namespace.
                  0
                  1. Contributeur
                    n.ch=new char[n.longueur+1]; //ou +2 puisque j'ai 2 chaines "ché pa"
                    C'est bien +1. Tu as un seul \0 final.

                    strcpy(n.ch,strcat(ch,c.ch));
                    C'est bof bof ça.
                    Utilise plutôt :
                    strncpy(n.ch,ch,n.longueur);
                    strncat(n.ch,c.ch,n.longueur);
                    

                    0
                    1. problème resolu :):)
                      Merci à vous.
                      0