Rechercher : dans
Par :

[C++] concatenation char*+char*

Dernière réponse le 29 jan 2009 à 22:38:57 progfann, le 29 jan 2009 à 14:24:52 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « [C++] concatenation char*+char* » dans :
Les variables en C++ VoirLes variables en C++ 1. Les différents types de variables 1.1 bool 1.2 char 1.3 unsigned short int 1.4 short int 1.5 unsigned long int 1.6 long int 1.7 int (16 bits) 1.8 int (32 bits) 1.9 unsigned int (16 bits) 1.10 unsigned int (32...
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Langage C - Les chaînes de caractères VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne...

1

kill4m, le 29 jan 2009 à 14:27:36

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 e­t ne laisser aucun doute sur le sujet . 
mais pourquoi je fais jamais ce que je dis moi ....

Répondre à kill4m

2

fiddy, le 29 jan 2009 à 14:37:03

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.
Google is your friend

Répondre à fiddy

3

progfann, le 29 jan 2009 à 15:23:43

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

Répondre à progfann

4

fiddy, le 29 jan 2009 à 15:32:31

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 ^^.
Google is your friend

Répondre à fiddy

5

progfann, le 29 jan 2009 à 15:35:33

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*) 

Répondre à progfann

6

fiddy, le 29 jan 2009 à 16:48:06

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.
Google is your friend

Répondre à fiddy

7

progfann, le 29 jan 2009 à 17:06:19

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;
}

Répondre à progfann

8

progfann, le 29 jan 2009 à 17:36:22

Aidez moi SVP

Répondre à progfann

9

fiddy, le 29 jan 2009 à 17:37:07

Pourrais-tu poster ton constructeur par recopie ?
Google is your friend

Répondre à fiddy

10

progfann, le 29 jan 2009 à 17:42:16

Chaine::Chaine(Chaine &c){
                            longueur=c.longueur;
                          ch=new char[longueur+1];
                          strcpy(ch,c.ch); 
                            }

Répondre à progfann

11

fiddy, le 29 jan 2009 à 17:52:05

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.
Google is your friend

Répondre à fiddy

12

progfann, le 29 jan 2009 à 17:55:51

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;
}

Répondre à progfann

13

fiddy, le 29 jan 2009 à 18:00:13

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*).
Google is your friend

Répondre à fiddy

14

progfann, le 29 jan 2009 à 20:25:21

Peut être que c'est un problème d'affectation, non??

Chaine c("bla"),r(" blo");
Chaine z;
z=c+r;

Répondre à progfann

15

fiddy, le 29 jan 2009 à 21:29:06

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 ;)
Google is your friend

Répondre à fiddy

16

progfann, le 29 jan 2009 à 22:07:01

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.

Répondre à progfann

17

fiddy, le 29 jan 2009 à 22:34:02

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);


Google is your friend

Répondre à fiddy

18

 progfann, le 29 jan 2009 à 22:38:57

Problème resolu :):)
Merci à vous.

Répondre à progfann
Collection CommentÇaMarche.net