Gestion de chaine de caractére en c++ avec nstring

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 042 fois - Téléchargée 20 fois

Contenu du snippet

voila une Classe qui gère les Chaine de caractère. cette version est vraiment pauvre mais toute aide ou une suggestion sera la bienvenue
merci

Source / Exemple :


// dans le Header *.h 

#include <iostream>

/*     NString  version 1.0 
    
  Web: http://www.niceclub.hostzi.com

  • /
class NString { public: NString(); NString(const NString &Str); NString(const char * Str); ~NString(); int StrCount(); NString operator=(const char *Str); NString operator=(const NString &Str); NString operator+(const char *Str); NString operator+(const NString &Str); char * c_str(); bool IsEmpty(); void Clear(); private: char *m_str; int m_Count; }; // Dans le CPP #include "NString.h" /* NString version 1.0 Web: http://www.niceclub.hostzi.com
  • /
int NStrLen(const char * Str) { int i = 0; while ( Str[i] != '\0' ) { i++; } return i; } char * copy(const char * str) { int Len = NStrLen(str); //int Len = strlen(str); char * StrCopy = new char[Len + 1]; for (int i = 0; i < Len ; i++ ) { StrCopy[i] = str[i]; } StrCopy[Len] = '\0'; return StrCopy; } NString::NString() { this->m_Count = 0; this->m_str = NULL; } NString::NString( const NString &Str ) { m_str = copy(Str.m_str); m_Count = Str.m_Count; } NString::NString( const char * Str ) { m_str = copy(Str); m_Count = NStrLen(Str); } int NString::StrCount() { return m_Count; } NString::~NString() { delete[] m_str; } NString NString::operator=( const char * Str ) { delete[] m_str; m_str = copy(Str); m_Count = NStrLen(Str); return *this; } NString NString::operator=( const NString &Str ) { delete[] m_str; m_str = copy(Str.m_str); m_Count = Str.m_Count; return *this; } NString NString::operator+( const char * Str ) { int SizeAll = m_Count + NStrLen(Str); char * End = new char[SizeAll + 1]; for (int i = 0; i < NStrLen(m_str); i++ ) { End[i] = m_str[i]; } for (int i = m_Count; i < SizeAll; i++ ) { End[i] = Str[ i - m_Count ]; } End[SizeAll] = '\0'; NString sRet(End); delete [] End; return sRet; } NString NString::operator+( const NString &Str ) { int SizeAll = m_Count + Str.m_Count; char * End = new char[SizeAll + 1]; for (int i = 0; i < NStrLen(m_str) ; i++ ) { End[i] = m_str[i]; } for (int i = m_Count; i < SizeAll; i++ ) { End[i] = Str.m_str[ i - m_Count]; } End[SizeAll] = '\0'; NString sRet(End); delete[] End; return sRet; } char * NString::c_str() { return m_str; } bool NString::IsEmpty() { if (m_Count == 0 ) { return true; } return false; } void NString::Clear() { delete[] m_str; m_Count = 0; }

A voir également

Ajouter un commentaire Commentaires
Messages postés
10
Date d'inscription
vendredi 14 août 2009
Statut
Membre
Dernière intervention
31 mai 2010

On remplace le Z par un N ...

L'opérateur + en tant que fonction libre à deux arguments:
NString operator+(const NString& lhs, const NString& rhs);
Pour t'en convaincre essaie ceci:
NString str(" ca marche pas");
str = "coucou," + str;

La fonction c_str() devrait renvoyer un const char* pour éviter que l'user foute le bordel en modifiant la chaine à l'extérieur.

A qui revient la responsabilité de StrCopy dans copy() ? -> boost::shared_ptr dans l'idéal.
Sinon je trouve que c'est une implémentation naïve de string, donc à ne pas utiliser.

Désolé si j'ai dit des choses qui on déjà été dites, je n'ai pas lu les autres commentaires.
Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011
1
Ah oui, return (!nbr) est "évidemment" un booléen, mais je voyais plutôt return (nbr) comme une récupération de valeur, et non comme un test pour savoir si la variable valait zéro.
Ma solution est en effet pas tellement bonne non plus. Mais je voulais apporter cette précision parce-que certains compilos sont chiants avec les booléens.
Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
120
> C'est en effet faux, mais ça aussi : bool NString::IsEmpty() { return m_Count; }
> comme tu le dis, CptPingu.

Petit inattention de ma part ça aurait du être bool NString::IsEmpty() { return !m_Count; }, au temps pour moi.

> La fonction doit retourner true si la chaine est vide, donc si m_Count = 0, or true != 0 en C++, et puis m_Count n'est pas un booléen.

Si son code avait été bien géré, alors m_Count aurait du être un unsigned int ou être conçu de manière à ne pas descendre en dessous de 0, et là plus de problème.
De plus, j'ai aussi donné une méthode plus robuste: "return m_Count <= 0", qui ne se base pas sur une conversion de m_Count, mais bien sur un résultat (une comparaison EST une expression booléenne).
A noter que "!m_Count" est aussi une expression booléenne.

> Pour moi : bool NString::IsEmpty() { return (m_Count)?false:true; } me semble correct.

Et c'est là que ce que tu dis est étrange. Tu critiques le fait que se baser sur la transformation en booléen de m_Count est bancale (ce qui peut être vrai), mais cette technique se base aussi dessus. Si m_Count vaut -1, tu retourneras "false" aussi !
Techniquement, cette solution fonctionne, mais est extrêmement inélégante, car elle fait un double travail inutile.

D'une manière générale on préfère toujours écrire:

return a < b;

Plutôt que (j'exagère un peu):

if ((a < b) == true)
{
return true;
}
else
{
return false;
}
Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011
1
Salut,
Je suis d'accord quant à l'utilité de ce code... Il aurait pu être intéressant pour des gens curieux d'apprendre par exemple, s'il avait été un minimum commenté.
Idem pour les fonctions strlen, etc.
Mais pour ceci : bool NString::IsEmpty() { return m_Count ? true : false; }

C'est en effet faux, mais ça aussi : bool NString::IsEmpty() { return m_Count; }
comme tu le dis, CptPingu.
La fonction doit retourner true si la chaine est vide, donc si m_Count = 0, or true != 0 en C++, et puis m_Count n'est pas un booléen.
Pour moi : bool NString::IsEmpty() { return (m_Count)?false:true; }
me semble correct.

Cordialement, uaip.
Messages postés
44
Date d'inscription
mardi 1 août 2006
Statut
Membre
Dernière intervention
15 juillet 2011
13
Merci de vos coms
Afficher les 11 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.