[C++] concatenation char*+char*

Résolu/Fermé
progfann Messages postés 365 Date d'inscription dimanche 11 mars 2007 Statut Membre Dernière intervention 23 septembre 2010 - 29 janv. 2009 à 14:24
progfann Messages postés 365 Date d'inscription dimanche 11 mars 2007 Statut Membre Dernière intervention 23 septembre 2010 - 29 janv. 2009 à 22:38
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

12 réponses

kill4m Messages postés 224 Date d'inscription jeudi 12 juin 2008 Statut Membre Dernière intervention 28 janvier 2012 26
29 janv. 2009 à 14:27
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 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
29 janv. 2009 à 14:37
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 365 Date d'inscription dimanche 11 mars 2007 Statut Membre Dernière intervention 23 septembre 2010 23
29 janv. 2009 à 15: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 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844 > progfann Messages postés 365 Date d'inscription dimanche 11 mars 2007 Statut Membre Dernière intervention 23 septembre 2010
29 janv. 2009 à 15:32
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 365 Date d'inscription dimanche 11 mars 2007 Statut Membre Dernière intervention 23 septembre 2010 23
29 janv. 2009 à 15:35
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 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
29 janv. 2009 à 16:48
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 365 Date d'inscription dimanche 11 mars 2007 Statut Membre Dernière intervention 23 septembre 2010 23
29 janv. 2009 à 17:06
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 365 Date d'inscription dimanche 11 mars 2007 Statut Membre Dernière intervention 23 septembre 2010 23
29 janv. 2009 à 17:36
Aidez moi SVP
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
29 janv. 2009 à 17:37
Pourrais-tu poster ton constructeur par recopie ?
0
progfann Messages postés 365 Date d'inscription dimanche 11 mars 2007 Statut Membre Dernière intervention 23 septembre 2010 23
29 janv. 2009 à 17:42
Chaine::Chaine(Chaine &c){
                            longueur=c.longueur;
                          ch=new char[longueur+1];
                          strcpy(ch,c.ch); 
                            }
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
29 janv. 2009 à 17:52
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 365 Date d'inscription dimanche 11 mars 2007 Statut Membre Dernière intervention 23 septembre 2010 23
29 janv. 2009 à 17:55
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 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
29 janv. 2009 à 18:00
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 365 Date d'inscription dimanche 11 mars 2007 Statut Membre Dernière intervention 23 septembre 2010 23
29 janv. 2009 à 20:25
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 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
29 janv. 2009 à 21:29
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 365 Date d'inscription dimanche 11 mars 2007 Statut Membre Dernière intervention 23 septembre 2010 23
29 janv. 2009 à 22:07
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 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
29 janv. 2009 à 22:34
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 365 Date d'inscription dimanche 11 mars 2007 Statut Membre Dernière intervention 23 septembre 2010 23
29 janv. 2009 à 22:38
problème resolu :):)
Merci à vous.
0