CLASSE CSTRING : GESTION DE CHAINES DE CARACTÈRES EN C++

cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 - 23 août 2004 à 14:52
guill76 Messages postés 193 Date d'inscription mercredi 24 août 2005 Statut Membre Dernière intervention 3 juin 2016 - 6 août 2007 à 19:11
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/25609-classe-cstring-gestion-de-chaines-de-caracteres-en-c

guill76 Messages postés 193 Date d'inscription mercredi 24 août 2005 Statut Membre Dernière intervention 3 juin 2016
6 août 2007 à 19:11
Correction:
Il faut un test supplémentaire pour ne pas réallouer la place pour la chaine :
CString &CString::operator=(const CString& string)
{
if (this!=&string)
{
reallocation(string.length()+1);
strcpy(ptr, string.getPtr());
}
return (*this);
}
guill76 Messages postés 193 Date d'inscription mercredi 24 août 2005 Statut Membre Dernière intervention 3 juin 2016
4 août 2007 à 00:03
Bonjour,

Je viens d'utiliser cette classe de string qui est très bien faite, je trouve, mais j'ai rencontré le bug suivant:
L'auto-affection désalloue la mémoire mais ne la recrée pas.
voici le code utilisé avec gcc sur mingw:
int main()
{
CString test="test d'auto-affectation";
cout<<test<<endl;//affiche "test d'auto-affectation"
test=test;
cout<<test<<endl;//affiche o$? en sortie
}
Il faudrait peut-etre créer une variable temporaire lorsque this=(objet de recopie) avant la réallocation?
Soilwork9 Messages postés 16 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 13 septembre 2004
25 août 2004 à 08:05
djl > Yep, mais bon, ca change rien à la présence de equals dans ma classe ;) Et puis dans le cas des String, on trouve aussi les operateurs +, += et == (et ca ne m'est jamais venu a l'idee de faire une classe qui derive de String : ca marche tellement bien, lol)

Nono > Je préfère faire des fonctions aussi claires et lisibles que possible, et dont le nom indique ce qu'elles font. Si je commence a faire des methodes qui prennent 50 parametres et qui font 50 trucs differents dans la meme methode, pour une classe aussi simple que celle-la, je ne sais pas ou je vais me retrouver en attaquant un gros projet !

Et en ce qui concerne les "doublons" (les méthodes "Java"), c'est comme tout : c'est inutile si tu ne t'en sers pas ! ^_^

J'ai commencé à regarder ta BString, et je suis... plutot perplexe. Mais ce n'est pas l'endroit pour en parler, donc je te laisserai un message sur la page appropriée.

++
Soilwork
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
24 août 2004 à 18:11
c'est ridicule de s'embeter avec les noms en c++, les namespaces sont la pour ca

Soilwork9 > si en java c'est equals cc'est parce que justement java ne supporte pas (entre autre) la surcharge des operateurs
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
24 août 2004 à 15:19
'lo

return (strcasecmp( ... ) ==0);
va très bien...

l'utilisation du Cxxx est effectivement une bonne convention & j'ai déjà expliqué pq j'aV opté pr des Bxxx.

Dans le cas des string, tu peux eventuellement géner des personnes ne voulant reprendre que des parties de ton codes mais après, C toi qui voit.

pour ma bibli
attend dc que je mette à jour toutes mes bibli
(prochainement)


pour les substring, je pense que tu m' a compris

sinon, fais comme tu veux,
je pense qu'il vaut mie avoir un nombre plus petit de fonctions avec eventuellementplus de paramètres(éventuellement optionnels)
mais C un choix et po de pb si tu opte pr une politique d'une multitude de petites fonctions...


autrement j'aV remarqué le parallèle à java... je trouve ces doublons inutils mais pourquoi pas...

Bon, je completerai plus tard
++
Nono.
Soilwork9 Messages postés 16 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 13 septembre 2004
24 août 2004 à 14:58
C'est marrant, je savais que tu posterais un commentaire ici ;) Je t'ai deja vu faire de la pub pour tes BString dans des commentaires pour d'autres classes de chaines, en survolant un peu le contenu de ce site. ~_^ En tout cas, merci pour le "Bien..".

En ce qui concerne le nom de la classe, a vrai dire, les MFC... Erm, je m'en moque un peu...! Je nomme mes classes comme ca (C + Nom de classe : CString, CMachin, CTruc), je vais pas faire une exception parce que c'est deja pris par un truc que je n'utilise pas de toute facon ;) Pour la réallocation, effectivement, tu as raison, et c'est volontaire et normal!

Les méthodes equals, et les deux substring, ce sont des equivalences avec Java, pour ceux qui ont pris l'habitude d'utiliser les String de ce langage (Moi, en l'occurence!). Tu aurais aussi pu demander pourquoi append alors qu'il y a les operateurs + et +=, etc...
Je ne pense pas que rassembler les méthodes pour changer la casse en une seule soit une bonne idee : comme ca, le nom de la méthode indique clairement ce qu'elle fait, et je ne vois pas trop ou est l'avantage de ce que tu proposes (??). D'ailleurs en réalité, je vois pas exactement ce que tu proposes!

Pour ton dernier exemple, j'aurais certes pu ecrire
return (! strcasecmp( ... ) );
Mais je ne trouve pas ca vraiment clair. Et puis ca change pas grand chose, a vrai dire.

Voila, merci pour les commentaires. J'irai voir ta BString! ^^
++
Soilwork
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
24 août 2004 à 10:01
1 dernier pr la rte :

if(strcasecmp(ptr, string.getPtr())==0)
return true;
return false;

no comment
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
24 août 2004 à 09:55
rq2 : pq des ";" après chaque méthode définie ds le header?

à quoi sert equals, == suffit

une des 2 fonctions suivantes, est inutiles:
CString substring(int index) const;
CString substring(int index, int length) const;
il suffit de faire le distingo au sein d'une seule
CString substring(int index, int length=-1) const;

idem, rassemble
CString &toLowerCase(); //En minuscules
CString &toUpperCase(); //En majuscules
CString &capitalize();

en une seule fonc

etc

sinon, je retrouve po mal mes BString & +

Magicalement...
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
24 août 2004 à 09:35
Bien...
Je déconseille cependant le nom de CString deja utilisé par les MFC, ça peut créer des confusions...

Une remarque : ton opérateur de réallocation vire tout ce que pouvait contenir ta chaine...

Magicalement...
Nono.
Soilwork9 Messages postés 16 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 13 septembre 2004
23 août 2004 à 16:34
Salut, et merci pour ton message!
Pour la longueur, tu as surement raison, je vais voir si je peux mettre a jour une variable représentant la longueur dans la méthode reallocation. Mais je dois verifier qu'il n'y a aucune méthode qui mette a jour la chaine sans passer par reallocation (raccourcissement de chaine en inserant juste un \0, par exemple)...

Pour le const : ARF! Ne me demande pas pourquoi j'ai fait ca, je ne saurais pas te repondre ;p Je devais etre dans une periode const a ce moment la, j'en mettais partout, lol. 'fin bon, c'est enlevé, et on fera comme si ca n'etait jamais arrivé ^_^

setPtr ne sert a rien, un peu comme isPalindrome peut-etre (lol), mais en plus setPtr est mal fait (mauvaise utilisation de strcpy, a priori... Pas de réallocation). Vais peut-etre le virer aussi ;)

Merci en tout cas, et a plus tard!
++
Soilwork
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
23 août 2004 à 14:52
deja bravo pour le code, la classe est assez complete et fonctionnelle

quelque remarque en passant, tu devrais stocker la taille dans une variable et faire un ascesseur inline plutot que de faire appel a chaque fois à strlen, ca peux devenir penalisant lors de plusieurs appels dans une boucle

ne specifie pas const une variable passé par
valeur "const int number" ca n'a aucune utilité

a quoi sert setPtr ? tu as deja le constructeur char* et l'operateur = char*
Rejoignez-nous