[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 -
progfann Messages postés 365 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je me suis bloqué sur cette methode:
main:
Ou est l'erreur SVP .
merci
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
-
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 .... -
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.-
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- 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 ^^.
-
-
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*)
-
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. -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
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; } -
Chaine::Chaine(Chaine &c){ longueur=c.longueur; ch=new char[longueur+1]; strcpy(ch,c.ch); } -
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. -
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; } -
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*). -
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 ;) -
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. -
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);