[C++] concatenation char*+char*

Résolu
progfann Messages postés 373 Statut Membre -  
progfann Messages postés 373 Statut Membre -
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
A voir également:

12 réponses

kill4m Messages postés 260 Statut Membre 26
 
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
fiddy Messages postés 11653 Statut Contributeur 1 847
 
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
progfann Messages postés 373 Statut Membre 23
 
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
fiddy Messages postés 11653 Statut Contributeur 1 847 > progfann Messages postés 373 Statut Membre
 
Ah 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
progfann Messages postés 373 Statut Membre 23
 
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
fiddy Messages postés 11653 Statut Contributeur 1 847
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
progfann Messages postés 373 Statut Membre 23
 
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
progfann Messages postés 373 Statut Membre 23
 
Aidez moi SVP
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
Pourrais-tu poster ton constructeur par recopie ?
0
progfann Messages postés 373 Statut Membre 23
 
Chaine::Chaine(Chaine &c){
                            longueur=c.longueur;
                          ch=new char[longueur+1];
                          strcpy(ch,c.ch); 
                            }
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
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
progfann Messages postés 373 Statut Membre 23
 
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
fiddy Messages postés 11653 Statut Contributeur 1 847
 
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
progfann Messages postés 373 Statut Membre 23
 
Peut être que c'est un problème d'affectation, non??
Chaine c("bla"),r(" blo");
Chaine z;
z=c+r;
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
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
progfann Messages postés 373 Statut Membre 23
 
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
fiddy Messages postés 11653 Statut Contributeur 1 847
 
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
progfann Messages postés 373 Statut Membre 23
 
problème resolu :):)
Merci à vous.
0