[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
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
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
- Coco chat connexion sur mobile, le tchat est fermé ? ✓ - Forum Réseaux sociaux
- Site coco chat (incitation a payer) ✓ - Forum Vos droits sur internet
- If char ✓ - Forum Programmation
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
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 ....
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 ....
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
29 janv. 2009 à 14:37
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.
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
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:
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
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
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 ^^.
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 ^^.
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
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:
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*)
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
29 janv. 2009 à 16:48
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
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
29 janv. 2009 à 17:06
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; }
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
29 janv. 2009 à 17:36
Aidez moi SVP
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
29 janv. 2009 à 17:37
Pourrais-tu poster ton constructeur par recopie ?
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
29 janv. 2009 à 17:42
Chaine::Chaine(Chaine &c){ longueur=c.longueur; ch=new char[longueur+1]; strcpy(ch,c.ch); }
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
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.
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.
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
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; }
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
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*).
Tu as juste Chaine(Chaine&) et Chaine(char*).
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
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;
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
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 ;)
T'inquiète, on va la chopper l'erreur ;)
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
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:
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.
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
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 :
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);
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
29 janv. 2009 à 22:38
problème resolu :):)
Merci à vous.
Merci à vous.