[C++] concatenation char*+char*
Résolu
progfann
Messages postés
373
Statut
Membre
-
progfann Messages postés 373 Statut Membre -
progfann Messages postés 373 Statut Membre -
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
A voir également:
- [C++] concatenation char*+char*
- Coco char - Accueil - Réseaux sociaux
- Remplaçant de Coco : quelles solutions pour tchater gratuitement en ligne ? - Accueil - Réseaux sociaux
- Convertir char en int c ✓ - Forum C
- Char(10) excel francais ✓ - Forum Excel
- [C]- convertir char en int ✓ - Forum C
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 ....
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 :
Sinon, si c'est pas ça, précise ton message d'erreur exact.
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:
pour tester d'abords le contenu de la chaine
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 ^^.
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:
sachant que j'ai definit un constructeur par defaut (sans arguments)
et la nouvelle mathode operator+:
erreur:
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 :
J'ai mis r.n+1 en supposant que tu n'as pas compté le '\0' dans longueur.
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:
dans le main:
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; }
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.
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*).
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 ;)
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:
Classe Chaine.cpp:
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:
p.s. j'ai pas ecris les includes et les namespace.
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.