begin process at 2012 05 27 14:26:46
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Chaîne de caractères

 > CLASSE CCHAINE

CLASSE CCHAINE


 Information sur la source

Note :
Aucune note
Catégorie :Chaîne de caractères Classé sous :chaine, classe, caractere Niveau :Initié Date de création :06/03/2005 Date de mise à jour :06/05/2006 19:08:02 Vu / téléchargé :6 760 / 609

Auteur : bobbyantho

Ecrire un message privé
Commentaire sur cette source (17)
Ajouter un commentaire et/ou une note

 Description

Une petite classe équivalente à la classe MFC CString mais en plus pratique

Source

  • #pragma once
  • #include <string.h>
  • #include <stdio.h>
  • #include <stdlib.h>
  • class CChaine
  • {
  • private:
  • int m_iTailleChaine;
  • char* m_strChaine;
  • public:
  • //constructeur par défaut
  • CChaine(void);
  • //constructeur de copie
  • CChaine(const CChaine& cpChaine);
  • //constructeur de copie pointeur
  • CChaine(const CChaine* cpChaine);
  • //constructeur avec argument (chaîne de caractères)
  • CChaine(const char* strArgChaine);
  • //constructeur avec argument (int)
  • CChaine(const int iArg);
  • //constructeur avec argument(unsigned int)
  • CChaine(const unsigned int uiArg);
  • //constructeur avec argument(float)
  • CChaine(const float fArg);
  • //constructeur avec argument(double)
  • CChaine(const double dArg);
  • //constructeur avec argument(long)
  • CChaine(const long lArg);
  • //constructeur avec argument(char)
  • CChaine(const char cArg);
  • //destructeur
  • ~CChaine(void);
  • //opérateur tableau, retourne le caractère à l'index
  • char operator [](int iIndex) const;
  • //opérateur comparaison(==)
  • int operator ==(const CChaine& argChaine) const;
  • //opérateur comparaison(!=)
  • int operator !=(const CChaine& argChaine) const;
  • //opérateur addition(+=)
  • CChaine operator +=(const CChaine& argChaine);
  • //opérateur addition symétrique (+)
  • friend CChaine operator +(const CChaine& argChaine1,const CChaine& argChaine2);
  • //opérateur affectation(=)
  • CChaine operator =(const CChaine& argChaine);
  • //incrémente tous les caractères alphanumériques
  • CChaine operator ++();
  • //décrémentete tous les caractères alphanumériques
  • CChaine operator --();
  • //retourne TRUE si la chaine est vide
  • BOOL IsVide(void) const;
  • //retourne la taille de la chaîne
  • int GetTaille(void) const;
  • friend size_t strlen(const CChaine& Chaine);
  • //retourne le nombre d'occurrences d'un caractère dans la chaîne
  • int NbOccurances(char cCaract) const;
  • //retourne le nombre d'occurrences d'une chaîne dans la chaîne
  • int NbOccurances(const char* strOccur) const;
  • //compare avec casse (identique à ==)
  • int CompareAvecCasse(const CChaine& argChaine) const;
  • //compare sans casse
  • int CompareSansCasse(const CChaine& argChaine) const;
  • //retourne l'index de la première occurence du caractère
  • int GetPos(char cCaract) const;
  • //retourne la valeur int correspondante
  • operator int() const;
  • //retourne la valeur float correspondante
  • operator float() const;
  • //retourne la valeur double correspondante
  • operator double() const;
  • //retourne la valeur long correspondante
  • operator long() const;
  • //retourne la valeur char correspondante
  • operator char() const;
  • //retourne la chaine terminée par '\0'
  • operator const char*() const;
  • //remplace toutes les occurences d'un caractère par un autre
  • void Remplace(char cCaract1,char cCaract2);
  • //remplace toutes les occurences d'une chaîne par une autre
  • void Remplace(const char* strChaine1,const char* strChaine2);
  • //insère une chaîne à un emplacement donné
  • void Insert(const char* strChaine, int iEmplacement);
  • //supprime le caractère de la chaine placé à l'index
  • void Supprime(int iIndex);
  • //supprime toutes les occurrences d'un caractère dans la chaîne
  • void Supprime(char cCaract);
  • //supprime toutes les occurrences d'une chaine dans la chaîne
  • void Supprime(const char* strChaine);
  • //renverse tous les caractères (le premier sera le dernier)
  • void Renverse(void);
  • //convertis en majuscules
  • void ConvertMaj(void);
  • //convertir en minuscule
  • void ConvertMin(void);
  • //extrait la partie gauche de la chaîne
  • friend CChaine GaucheStr(const CChaine& strChaine, int iNbCaract);
  • //extrait le milieu de la chaîne
  • friend CChaine MilieuStr(const CChaine& strChaine, int iDebut, int iNbCaract);
  • //extrait la partie droite de la chaîne
  • friend CChaine DroiteStr(const CChaine& strChaine, int iNbCaract);
  • //vide la chaine
  • void Reset(void);
  • };
#pragma once

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

class CChaine
{
private:
	int m_iTailleChaine;
	char* m_strChaine;

public:
	//constructeur par défaut
	CChaine(void);
	//constructeur de copie
	CChaine(const CChaine& cpChaine);
	//constructeur de copie pointeur
	CChaine(const CChaine* cpChaine);
	//constructeur avec argument (chaîne de caractères)
	CChaine(const char* strArgChaine);
	//constructeur avec argument (int)
	CChaine(const int iArg);
	//constructeur avec argument(unsigned int)
	CChaine(const unsigned int uiArg);
	//constructeur avec argument(float)
	CChaine(const float fArg);
	//constructeur avec argument(double)
	CChaine(const double dArg);
	//constructeur avec argument(long)
	CChaine(const long lArg);
	//constructeur avec argument(char)
	CChaine(const char cArg);

	//destructeur
	~CChaine(void);

	//opérateur tableau, retourne le caractère à l'index
	char operator [](int iIndex) const;
	//opérateur comparaison(==)
	int operator ==(const CChaine& argChaine) const;
	//opérateur comparaison(!=)
	int operator !=(const CChaine& argChaine) const;
	//opérateur addition(+=)
	CChaine operator +=(const CChaine& argChaine);
	//opérateur addition symétrique (+)
	friend CChaine operator +(const CChaine& argChaine1,const CChaine& argChaine2);
	//opérateur affectation(=)
	CChaine operator =(const CChaine& argChaine);
	//incrémente tous les caractères alphanumériques
	CChaine operator ++();
	//décrémentete tous les caractères alphanumériques
	CChaine operator --();

	//retourne TRUE si la chaine est vide
	BOOL IsVide(void) const;
	//retourne la taille de la chaîne
	int GetTaille(void) const;
	friend size_t strlen(const CChaine& Chaine);
	//retourne le nombre d'occurrences d'un caractère dans la chaîne
	int NbOccurances(char cCaract) const;
	//retourne le nombre d'occurrences d'une chaîne dans la chaîne
	int NbOccurances(const char* strOccur) const;
	//compare avec casse (identique à ==)
	int CompareAvecCasse(const CChaine& argChaine) const;
	//compare sans casse
	int CompareSansCasse(const CChaine& argChaine) const;
	//retourne l'index de la première occurence du caractère
	int GetPos(char cCaract) const;

	//retourne la valeur int correspondante
	operator int() const;
	//retourne la valeur float correspondante
	operator float() const;
	//retourne la valeur double correspondante
	operator double() const;
	//retourne la valeur long correspondante
	operator long() const;
	//retourne la valeur char correspondante
	operator char() const;
	//retourne la chaine terminée par '\0'
	operator const char*() const;

	//remplace toutes les occurences d'un caractère par un autre
	void Remplace(char cCaract1,char cCaract2);
	//remplace toutes les occurences d'une chaîne par une autre
	void Remplace(const char* strChaine1,const char* strChaine2);
	//insère une chaîne à un emplacement donné
	void Insert(const char* strChaine, int iEmplacement);
	//supprime le caractère de la chaine placé à l'index
	void Supprime(int iIndex);
	//supprime toutes les occurrences d'un caractère dans la chaîne
	void Supprime(char cCaract);
	//supprime toutes les occurrences d'une chaine dans la chaîne
	void Supprime(const char* strChaine);
	//renverse tous les caractères (le premier sera le dernier)
	void Renverse(void);
	//convertis en majuscules
	void ConvertMaj(void);
	//convertir en minuscule
	void ConvertMin(void);
	//extrait la partie gauche de la chaîne
	friend CChaine GaucheStr(const CChaine& strChaine, int iNbCaract);
	//extrait le milieu de la chaîne
	friend CChaine MilieuStr(const CChaine& strChaine, int iDebut, int iNbCaract);
	//extrait la partie droite de la chaîne
	friend CChaine DroiteStr(const CChaine& strChaine, int iNbCaract);
	//vide la chaine
	void Reset(void);
};

 Conclusion

Vos commentaires sont les bienvenus...

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

08 mars 2005 15:42:36 :
Voilà, alors j'ai rajouté quelques constructeurs ainsi que quelques fonctions membres pour la conversion (pas encore toutes celles possibles mais les principales). Et aussi quelques const...
12 mars 2005 11:54:10 :
Bon, voilà, j'ai eu le temps de corriger tous les petits bugs(je crois) et j'ai ajouté quelques fonctionnalités.
06 mai 2006 19:08:03 :
J'ai corrigé quelques bugs et jouté de nouvelles fontionnalités que je vous laisse découvrir...

 Sources du même auteur

Source avec Zip Source avec une capture CLASSE CGRAPHXY
Source avec Zip CLASSE CLECTEURVIDÉO
Source avec Zip CLASSE CTHREAD
Source avec Zip CLASSE CUSERINFO
Source avec Zip CLASSE CPIXEL

 Sources de la même categorie

CALCUL DE CLEF RIB par Renfield
Source avec Zip [C] WD_STRING V2.2 par cyberripper
Source avec Zip LES STRING EN C, AFFECTATION, CONCATÉNATION, SPLIT, ... par appranting
Source avec Zip [C] WD_STRING V1.9 par cyberripper
Source avec Zip LIBRAIRIE LANGUAGES par astro53

 Sources en rapport avec celle ci

Source avec Zip GSTRING - GESTION DES CHAINES DE CARACTÈRES par Neokript
Source avec Zip MYSTRING, CLASSE TRAITANT DES CHAÎNES DE CARACTÈRES par Noubzor
Source avec Zip CLASSE DE GESTION DE CHAINE DE CARACTERES SECURISEE [VC++2K5... par Zer0 le Her0
Source avec Zip EDITEUR DE TEXTE EN LIGNE DE COMMANDE - C - DEVCPP - CHAINES... par pyronet
Source avec Zip Source avec une capture SETIOSFLAGS ET RESETIOSFLAGS par sock_work

Commentaires et avis

Commentaire de steve_clamage le 06/03/2005 16:16:12

Il manque tout les const, ce qui fait (entre autre) que tu n'as pas explicitement définie le constructeur de copie et l'opérateur d'affectation.
Il est aussi inutile de définir le même opérateur pour un char*  (qui devrait etre const) si tu as déja définie la conversion char*->CChaine (constructeur).

Commentaire de magic_Nono le 08/03/2005 12:01:01

Steve => cela permet parfois de gagner en vitesse et taille


bobbyantho>
lorsque tu aura modifié ceci, tes sources seront au moins 4 fois plus rapides...

en plus du point capital que Steve  à cité,
il manque beaucoup de fonctionnalités (format,checkIn,...)
conversions....

jette donc un oeil sur les BString que tu trouvera dans quasi toutes mes sources
cela pourra te donner des idées pour améliorer considérablement cette classe.

Bons début,
++
Nono

Commentaire de bobbyantho le 08/03/2005 14:27:36

Ok, merci pour vos conseils.
C'est vrai, j'aurais du penser aux const !

Merci magic_nono pour les idées, ta classe est très bien (bien que j'ai un peu de mal avec l'assembleur) !!!.

Je m'y attelle de ce pas.

Commentaire de Hades53 le 10/03/2005 00:24:43

Pour la taille, plutôt préconiser de l'unsigned long ;)
++

Commentaire de cosmobob le 10/03/2005 14:02:54

salut,
pourquoi un destructeur virtuel ? ta classe CChaine n'a pas de fonctions virtuelles; si elle est utilisée comme classe de base pour manipuler des classes dérivées il n'y aura pas de polymorphisme... donc ta classe ne sera pas utilisée comme classe de base pour manipuler des classes dérivées, donc pas besoin de destructeur virtuel.
non?

Commentaire de cosmobob le 10/03/2005 14:07:01

ha et tu peux aussi rajouter des const pour certaines méthodes; par exemple:

remplace    int Taille(void);
par             int Taille(void) const;

ca signifie que l'appel de la méthode Taille ne modifie pas l'object CChaine que tu manipules. Ca permet ainsi d'appeler Taille() sur une référence constante d'une CChaine.

a++

Commentaire de magic_Nono le 10/03/2005 15:14:47

unsigned long n'est pas nécessaire si unsigned int est déjà employé

sur les systemes actuels, (ie quasi tous depuis win95)
'int' est équivalent à 'long'

une idée serait peut etre de passer en 64 bytes
avec unsigned long long
mais attention, on pert alors en portabilité car ce dernier type n'est pas défini pour tous les compilateurs

++
Nono & Vic

Commentaire de steve_clamage le 10/03/2005 18:16:05

N'oubliez pas que std::size_t est la pour ca.

Un typedef membre public
typedef std::size_t size_type;

size_type m_iTailleChaine;

Commentaire de magic_Nono le 10/03/2005 19:51:50

ui, size_t est là
il a une complexité de n, car il doit parcourir toute la chaine

prenons un exemple simple

si on veut afficher la chaine a l'envers,
tu va commencer par demander la taille n
et à la parcourir dans l'autre sens
soit 2n


en mémorisant la taille;
rappel mem : 1
parcours : n
soit n+1 ~ n

quoiqu'il en soit, autant stocker cette donnée...
++
Nono.

Commentaire de steve_clamage le 10/03/2005 20:18:35

par exemple, mais on prend surtout l'exemple des concatenation de chaines pour montrer à quel point l'absence d'information sur la taille est mortelle pour les performances.

std::string::operator+= est bien plus rapide que std::strcat pour concatener des chaines, de même std::string::size pulverise std::strlen, d'autant plus si la chaine est longue.

Commentaire de BruNews le 11/03/2005 01:06:15 administrateur CS

Si on cherche les performances, y a peu de chances qu'on utilise std::string ni quelque autre classe de chaine, alors...

Commentaire de magic_Nono le 11/03/2005 09:26:05

Tiens, bj BN
C'est vrai, que rien ne vaut l'absence de classe et l'assembleur si on recherche la perf pure

Mais les classes sont tellement plus agréable pour la séparation des opérations et la compréhension du code que l'on recherche un moindre mal en utilisant le C++
De toute façon, ce n'est pas à toi qu'il faut l'apprendre.

et on est pas d'orient à réinventer et prouver la roue toutes les 30 secondes.
Généralisation et réutilisation sont nos leitmotivs !

Magicalement
BC

Commentaire de steve_clamage le 11/03/2005 19:59:50

Les tests serieux (ceux fais avec un vrai compilateur C++ et une vrai STL) montre en gros 5% de difference, comparé au cout de maintenance infiniment plus faible.

Globalement en C++ on est cencé atteindre des performances au dessus du C car l'optimiseur dispose de plus d'information sur le code (constance, typage tres puissant, OO, templates).  En C la traduction est trop proche du source (c'est plus au programmeur d'optimiser).

BruNews, si tu as le temps, tu pourrais jeter un oeil à cet article (qui n'est qu'un apercu de l'iceberg) ?
http://osl.iu.edu/~tveldhui/papers/Expression-Templates/exprtmpl.html

Commentaire de BruNews le 11/03/2005 20:12:46 administrateur CS

Je lis cela au debut:
The expression can be inlined into the function body, which results in faster and more convenient code than C-style callback functions.

Ai-je mal compris ? On parle de fonctions de chaines genre strcpy, strcat, etc... Aucun callback en C cause qu'il n'y a pas de fonctions, le compilo met tout l'asm direct dans le code, ces pseudos fonctions ne sont que des macros.

Commentaire de steve_clamage le 11/03/2005 20:39:48

Comment ca ? Qu'est ce que tu entends par "Aucun callback en C cause qu'il n'y a pas de fonctions" ?

Commentaire de BruNews le 11/03/2005 20:56:22 administrateur CS

ben c'est clair, si j'ecris
strcpy(buff, psz);
le compilo met l'asm direct dans le code, il n'y a aucun appel de fonction car strcpy est macro.
Si on peut trouver + rapide, qu'on me le signale.

Commentaire de steve_clamage le 11/03/2005 21:04:29

Oui, d'accord pour ca, mais la on parle de ce qui ne peut etre inliner, tels que les callbacks ou accessoirement les expressions vectorielles (mais trés utile dans les domaines scientifiques).

L'article montre en gros que les templates permettent de résoudre à la compilation pas mal de tuyauteries imbriquées bien complexes, pour peu qu'on enrobe ca de templates qui seront forcement dérouler et inliner à la compilation.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Rechercher une chaine de caractere [ par Johjo ] Il n'y aurait pas une fonction qui me permette de retrouver une chaine de caractere dans une autreparce moi, je trouve rien du tout :(Si quelqu'un pou PB DE CHAINE DE CARACTERE [ par Orkblutt ] pkoi ceci me genere t'il une erreur a l'execution??#include &lt;string&gt;void main(){ int o; o=2000; char* O=new char; itoa(o,O,10); char* ch="Fichie PB DE CHAINE DE CARACTERE [ par Orkblutt ] pkoi ceci me genere t'il une erreur a l'execution??#include &lt;string&gt;void main(){ int o; o=2000; char* O=new char; itoa(o,O,10); char* ch="Fichie Ajouter des slash [ par Mike ] SAlut,je recupere une chaine de caractere qui correspond au PATH d'un fichier, ensuite je souhaite l'utiliser comme variable, mais le probleme c que l Convertir chaine de caractere -> decimal [ par LordBob ] Salut a tous, en fait je voudrai juste savoir comment est-ce ke l'on pouver convertir une chaine de caractère (ex: salut) en decimal... Voila, m [VC++ 6.0] Extraire une chaine d'une CListBox [ par fredcpp ] Bonjour, j'essaye d'extraire une chaine de caractere ( ou plutot un item qui est une chaine de caractere ) d'une CListBox.Cette CList est bien remplie Exploitation de fichier en C ?!?!?! [ par GazGaz ] lu allalors voila le truc c'est que je voudrais aller chercher des infos dans un fichier qui est structuré de la meme maniere lignes apres lignes. Je comparation chaine de caractere [ par SfyLer ] prise de tête j'arrive pas a comparer de chaine de caractere:#include &lt;iostream.h&gt;#include &lt;string.h&gt;char main(void){ char login[6]; cout Convertir une chaine de caractere en Float [ par Johjo ] Bon, voilà, j'ai encore un probleme.Je dois maintenant convertir un chaine de caractere en float, et je ne trouve pas de fonctions, j'ai regardé dans caractere d'échappement dans une chaine [ par lyde ] je souhaite envoyer la chaine"01060AE0205040045" en hexadecimal, donc je l'ai mis sous la forme "\x01\x06\x01\xAE\x02\x05\x04\x00\x45"seulement \x00 e


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,967 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales