[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. 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
  2. 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
      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. 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. 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
          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. Chaine::Chaine(Chaine &c){
                                        longueur=c.longueur;
                                      ch=new char[longueur+1];
                                      strcpy(ch,c.ch); 
                                        }
            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. 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. 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
                  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. 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