[C++] concatenation char*+char*

Résolu
progfann Messages postés 365 Date d'inscription   Statut Membre Dernière intervention   -  
progfann Messages postés 365 Date d'inscription   Statut Membre Dernière intervention   -
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. 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
  2. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   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
    1. progfann Messages postés 365 Date d'inscription   Statut Membre Dernière intervention   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
      1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847 > progfann Messages postés 365 Date d'inscription   Statut Membre Dernière intervention  
         
        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
  3. progfann Messages postés 365 Date d'inscription   Statut Membre Dernière intervention   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
  4. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

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