begin process at 2012 05 27 16:37:11
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Chaîne de caractères

 > GESTION DE CHAINE DE CARACTÉRE EN C++ AVEC NSTRING

GESTION DE CHAINE DE CARACTÉRE EN C++ AVEC NSTRING


 Information sur la source

Note :
Aucune note
Catégorie :Chaîne de caractères Classé sous :CLASSE ZSTRING, STRING, chaine deCaractére Niveau :Initié Date de création :11/11/2009 Date de mise à jour :11/11/2009 19:35:05 Vu :2 884

Auteur : xmustapha

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note


 Description

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

  • // 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;
  • }
// 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;


}



 Historique

11 novembre 2009 19:35:06 :
Erreur au code source

 Sources du même auteur

Source avec Zip INTERNET IP FINDER TROUVER VOS ADRESSE IP (INTERNET)
Source avec Zip CLIENT/SERVEUR AVEC TSOCKETSERVER & TCLIENTSOCKET
Source avec Zip SUSPEND RESUME KILL PROCESS
Source avec Zip NICEPLAYER LISEZ VOS MP3 WMA AVEC FMOD EX
Source avec Zip ANTI-DANGEROUS PROCESS

 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 [C] WD_STRING V2.2 par cyberripper
Source avec Zip [C] WD_STRING V1.9 par cyberripper
Source avec Zip GSTRING - GESTION DES CHAINES DE CARACTÈRES par Neokript
Source avec Zip VOTRE AVIS, CALCUL DE TFIDF C++ par elprogramor
Source avec Zip CLASS STRING par T_Mehdi

Commentaires et avis

Commentaire de soso62fr le 11/11/2009 23:36:26

Salut!
Ta classe est une classe de base mais cependant il est loin d'être optimisée :

1 : Dans le corps de operator+( const NString &Str ), les instructions sont en trop et inutiles car ils sont déjà écris dans operator+( const NString * Str ) donc tu peux te servir de cette dernière, en gros tu pouvais écrire ça :

operator+( const NString &Str ) {
     operator+ ( Str->m_str );
}

Ceci est notamment valable pour operator=, operator+ et le constructeur !

2 : Tu réinvente la roue, et ça... c'est parfaitement inutile ! Tu réimplante strlen, strcat (pour l'opérateur +) pour aucune cause apparente !

3 : Dans l'opérateur +, tu dés-alloues la mémoire et tu alloues ensuite la mémoire avec la bonne taille... Une curieuse façon de faire, tu pouvais très bien agrandir ou réduire la mémoire sans pour autant la dés-allouer, par exemple avec la fonction realloc (pour le C mais marche parfaitement pour le C++).

4 : Tu optimises pas trop ton code, tu peux gagner des lignes, par exemple avec les conditions ternaires. Ex avec bool NString::IsEmpty()  :

bool NString::IsEmpty()  {
    return m_Count ? true : false;
}

Tu peux aussi optimiser la vitesse avec quelques conditions en plus, exemple tu peux éviter de ré-allouer la mémoire si la taille de la chaine à concaténer est à 0, exemple : chaine + ""

Commentaire de soso62fr le 11/11/2009 23:36:57

Elle* (une class pas un class lol)

Commentaire de CptPingu le 12/11/2009 10:17:34 administrateur CS

> Tu optimises pas trop ton code, tu peux gagner des lignes, par exemple avec les conditions ternaires.
Non. Les opérateurs ternaires n'optimise pas le code. Gagner des lignes dans un code ne fait pas aller celui-ci plus vite. De plus, l'opérateur ternaire est moins lisible, donc est souvent à éviter.

> bool NString::IsEmpty()
> {
>   return m_Count ? true : false;
> }
Beurk, mauvais exemple. Dans le cas d'un booléen, on ne renvoit jamais si celui-ci est vrai ou faux, mais directement celui-ci:

bool NString::IsEmpty()
{
  return m_Count;
}

Ou à la limite:

bool NString::IsEmpty()
{
  return m_Count <= 0;
}


Sinon, je suis assez d'accord avec ce qui est dit. Ce genre de code existe déjà sur code-source. C'est une énième ré-implémentation de la classe String, sans grande originalité (une classe string utilisant un flyweight ou une lazy copy à la QString aurait été plus intéressant...).

Commentaire de soso62fr le 12/11/2009 13:22:06

Ahhhhh !! Quelle erreur ! Je sais pas pourquoi j'ai écrit ça :
>m_Count ? true : false;

?? C'est peut être parce que j'ai écrit ça à minuit ou que je n'avais pas fait attention au type retourné, bref !

Merci pour cette correction CptPingu mais cependant je suis pas d'accord avec ça :

>Gagner des lignes dans un code ne fait pas aller celui-ci plus vite.

Les conditions ternaires sont très utiles pour les "GROS" programmes, ils agissent bien sûr sur le code source lui même et non pas au rendu final, c'est-à-dire le fichier exécutable, mais j'avoue qu'ici ils sont quand même inutiles et rende le code moins lisible.

Commentaire de CptPingu le 12/11/2009 13:38:43 administrateur CS

> ?? C'est peut être parce que j'ai écrit ça à minuit ou que je n'avais pas fait attention au type retourné, bref !
:p

> Les conditions ternaires sont très utiles pour les "GROS" programmes,
Ca ne change rien. Un bon programme est découpé en modules, et en petite fonction. Une fonction ne devrait pas excéder 50 lignes en moyennes.
Le seul cas ou le ternaire est pertinent, c'est dans le cas d'une répétition successive de conditions quasis identiques.

>Merci pour cette correction CptPingu mais cependant je suis pas d'accord avec ça :
> >Gagner des lignes dans un code ne fait pas aller celui-ci plus vite.
Bien différencier: gain de ligne et clarté du code. Les deux ne sont pas liés, et je pense que tu voulais plus parlé de clarté de code que de véritable gain de ligne.

Commentaire de soso62fr le 12/11/2009 17:33:55

Euh .... D'accord, je m'avoue vaincu ! :p Car je vois que ton raisonnement est correct !

Donc je retire ce que j'ai dis sur les conditions ternaires ...

Ciao CptPingu ;)

Commentaire de xmustapha le 12/11/2009 21:08:15

Merci de vos coms

Commentaire de uaip le 14/11/2009 02:02:49

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.

Commentaire de CptPingu le 14/11/2009 10:37:35 administrateur CS

> 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;
}

Commentaire de uaip le 14/11/2009 12:56:11

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.

Commentaire de sboli le 16/11/2009 10:50:57

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.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

petit pb de type string [ par bidules ] D'apres ce que g pu apprendre lorsque l'on veut declarer une variable de type string il faut faire :#include &lt;string&gt;string variable;c bien ca? Appel d'une Dll en C avec ASP [ par carlos ] Salut,j'ai une dll en C de +/- 15.000 lignes donc trop long à réecrire. Je voudrais pouvoir l'appeler à partir d'une Asp...en plus, pour etre portable C++ Standard ? [ par mmuller57 ] Voila, je viens d'aller sur le site de Bjarne Stroustrup et j'y ai pris un exemple de code source en C++ standard :#include&lt;iostream&gt;#include&lt Conversion Float to String [ par PierreP ] Bonjour à tous !je suis en train de me prendre la tête pour créer une fonction de conversion d'un réel en une chaine de caractère (problème du débutan Renommer un fichier [ par mindark ] Bonjour, j'essaie tout betement de renommer un fichier a l'aide des api, mais ca ne marche pas !Je veux renommer "kk.txt" en "qq.txt"String ancien="C: Pb Chaîne de caractères [ par mmuller57 ] Bonjour,J'ai créé un petit programme qui convertit les caractères d'une chaîne de caractères par leurs codes ASCII :#include &lt;iostream&gt;#include Impression String [ par teamours ] Je voudrais savoir komen on fé pour imprimer le contenue d'une varible CStringUn echaine de caractere koi....Merciiiiiiiii AnsiString et Char [ par JCLK ] J'ai un leger probleme :je recupere une String et j'ai ensuite besoin de la transformer en char *Est-ce possible ?La String contient un path ("C:\...\ longeur d'une string [ par angelique ] Bonjour, je n'arrive pas à retourner la longueur d'une srting :string result_s;result_s = vertex_label(boost::target(*ei, g), g); int longueur = strl longeur d'une string [ par angelique ] Bonjour, je n'arrive pas à retourner la longueur d'une srting :string result_s;result_s = vertex_label(boost::target(*ei, g), g); int longueur = strl


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,733 sec (3)

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