begin process at 2012 05 27 19:01:13
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Chaîne de caractères

 > REMPLACEMENT AU SEIN DE CHAINES [ÉVOLUTION DES BSTRING... ;) ]

REMPLACEMENT AU SEIN DE CHAINES [ÉVOLUTION DES BSTRING... ;) ]


 Description

suite a plsr questions & conseils sur le forum

voici une source consacrer au remplacement de chaines au sein d'une autre

juste pour memoire : actuellement

namespace BIBLI_BC{
class BString
{
...
private:
bool remplacePremierAParB(const BString& a, const BString& b);
void majTaille();
...
unsigned int i_taille;
char*c_chaine;

};
};
(repris ultérieurement avec des m_ comme membre)

Source

  • void BString::supprimeOccurence(const BString& test)
  • {
  • /// --------------------------------------------------------------------------
  • /// ---------------- BString::supprimeOccurence(BString test) ----------------
  • /// --------------------------------------------------------------------------
  • /// ----- Objectif : supprimer les occurences d'une sous-chaine ds la chaine stockée
  • /// ----- PreCond : /
  • /// ----- PostCond : /
  • /// ----- Etat : 1 (-1<0<1<2)
  • /// --------------------------------------------------------------------------
  • /// ----- BString test : valeur de test
  • /// --------------------------------------------------------------------------
  • /// ----- Var Muettes (cf.partie préc) (1) : test
  • /// ----- Var In (1) : test
  • remplaceAParB(test,"");
  • }
  • bool BString::remplacePremierAParB(const BString& a, const BString& b)
  • {
  • /// ---------------------------------------------------------------------------------------------
  • /// ---------------- BString::remplacePremierAParB(BString a ,BString b) -> bool ----------------
  • /// ---------------------------------------------------------------------------------------------
  • /// ----- Objectif : remplacer la 1ere ocurence d'une chaîne par une autre dans celle de la classe
  • /// ----- PreCond : /
  • /// ----- PostCond : /
  • /// ----- Etat : 1 (-1<0<1<2)
  • /// ----- MaJ 06/08/04 : accélération,cas mm taille....
  • /// ----- MaJ 18/08/04 : accélération : dbl ptr ,cas taille>.... & memmove !!! & memcpy
  • /// ---------------------------------------------------------------------------------------------
  • /// ----- BString a : chaîne à remplacer
  • /// ----- BString b : chaîne de remplacement
  • /// ---------------------------------------------------------------------------------------------
  • /// ----- retour (bool) : cf.obj
  • /// ---------------------------------------------------------------------------------------------
  • /// ----- Var Utilisées de la classe (1) : i_taille
  • /// ----- Var Muettes (cf.partie préc) (2) : a ,b
  • /// ----- Var Internes à la fonction (3) : i ,l ,plomp
  • /// ----- Var In (3) : a ,b ,i_taille
  • unsigned int i,l=a.i_taille;
  • if(l==0)
  • PB1("BString::remplacePremierAParB\nval à remplacer vide");
  • if(l>i_taille)
  • return false;
  • if(l==b.i_taille)
  • {
  • for(i=0;i<(i_taille-l+1);i++)
  • if(c_chaine[i]==a.c_chaine[0])
  • {
  • if(l==1||a==deA(i,i+l-1))
  • {
  • //for(j=0;j<l;j++)c_chaine[i+j]=b.c_chaine[j];
  • memcpy(&(c_chaine[i]),b.c_chaine,b.i_taille);//dest,src,taille
  • return true;
  • }
  • }
  • return false;
  • }
  • else
  • {
  • if(l>b.i_taille) // new 18/08/04
  • {
  • for(i=0;i<(i_taille-l+1);i++)
  • if(c_chaine[i]==a.c_chaine[0])
  • {
  • //if(l==1||a.operator==(deA(i,i+l-1)))
  • if(l==1||a==deA(i,i+l-1))
  • {
  • //for(j=0;j<b.i_taille;j++)c_chaine[i+j]=b.c_chaine[j];
  • memcpy(&(c_chaine[i]),b.c_chaine,b.i_taille);//dest,src,taille
  • memmove(&(c_chaine[i+b.i_taille]),&(c_chaine[i+l]),i_taille -i-l+1);//dest,src,taille
  • majTaille();
  • return true;
  • }
  • }
  • }
  • return false;
  • }
  • BString plomp;
  • for(i=0;i<(i_taille-l+1);i++)
  • if(c_chaine[i]==a.c_chaine[0])
  • {
  • plomp=deA(i,i+l-1);
  • if(plomp==a)
  • {
  • BString plomp=""; //masquage !!!
  • if(i>0)
  • plomp=deA(0,i-1);
  • plomp+=b;
  • if(i<(i_taille-l))
  • plomp+=depuis(i+l); //-1
  • (*this)=plomp;
  • return true;
  • }
  • }
  • return false;
  • }
  • bool BString::remplaceAParB(const BString a, const BString b, bool recursif)
  • {
  • /// -----------------------------------------------------------------------------------------------------
  • /// ---------------- BString::remplaceAParB(BString a ,BString b ,bool recursif) -> bool ----------------
  • /// -----------------------------------------------------------------------------------------------------
  • /// ----- Objectif : remplacer les ocurences d'une chaîne par une autre dans celle de la classe
  • /// ----- PreCond : A pas dans B
  • /// ----- PostCond : /
  • /// ----- Etat : 1 (-1<0<1<2)
  • /// ----- MaJ 18/12/03: accélération: non récusrsivité & var de recursivité
  • /// ----- MaJ 06/08/04 : accélération,cas mm taille....
  • /// ----- MaJ 18/08/04 : accélération : dbl ptr ,cas taille>.... & memmove !!! & memcpy
  • /// -----------------------------------------------------------------------------------------------------
  • /// ----- BString a : chaîne à remplacer
  • /// ----- BString b : chaîne de remplacement
  • /// ----- bool recursif(par défaut : 'false') : effectuer recursivement la modif?
  • /// -----------------------------------------------------------------------------------------------------
  • /// ----- retour (bool) : Si au - 1 cht a été effectué
  • /// -----------------------------------------------------------------------------------------------------
  • /// ----- Var Utilisées de la classe (1) : i_taille
  • /// ----- Var Muettes (cf.partie préc) (3) : a ,b ,recursif
  • /// ----- Var Internes à la fonction (4) : i ,l ,plomp ,rep
  • /// ----- Var In (4) : a ,b ,i_taille ,recursif
  • bool rep=false;
  • unsigned int i,l=a.i_taille;
  • if(l==0)
  • PB1("BString::remplaceAParB\nval de test nulle");
  • if(recursif)
  • while(remplacePremierAParB(a,b))
  • rep=true;
  • else
  • {
  • if(l>i_taille)
  • return false;
  • if(l==b.i_taille)
  • {
  • for(i=0;i<(i_taille-l+1);i++)
  • if(c_chaine[i]==a.c_chaine[0])
  • {
  • if(l==1 || a==deA(i,i+l-1))
  • {
  • //for(j=0;i<l;j++)c_chaine[i+j]=b.c_chaine[j];
  • memcpy(&(c_chaine[i]),b.c_chaine,b.i_taille);//dest,src,taille
  • rep=true;
  • i+=l-1;
  • }
  • }
  • }
  • else
  • if(l>b.i_taille) // new 18/08/04
  • {
  • /// nota : je C, bruNews, j'aurai pu utilisé des char*, C pareil, non? - B
  • //rappel: i:ptr actu sur c_chaine
  • //rappel: l=a.i_taille
  • for(i=0;i<(i_taille-l+1);i++)
  • if(c_chaine[i]==a.c_chaine[0])
  • {
  • if(l==1||a==deA(i,i+l-1))
  • {
  • //for(j=0;j<b.i_taille;j++)c_chaine[i+j]=b.c_chaine[j];
  • memcpy(&(c_chaine[i]),b.c_chaine,b.i_taille);//dest,src,taille
  • /// Nota : peut-etre serait-il plus judicieu de pas faire ce mem move a chaque fois...
  • ///+ cela ns ralentit il vraiement?
  • memmove(&(c_chaine[i+b.i_taille]),&(c_chaine[i+l]),i_taille -i-l+1);//dest,src,taille
  • rep=true;
  • i+=b.i_taille-1;
  • }
  • }
  • majTaille();
  • }
  • else
  • for(i=0;i<(i_taille-l+1);i++)
  • if(c_chaine[i]==a.c_chaine[0])
  • {
  • if(l==1 || a==deA(i,i+l-1))
  • {
  • BString plomp="";
  • if(i>0)
  • plomp=deA(0,i-1);
  • plomp+=b;
  • if(i<(i_taille-l))
  • plomp+=depuis(i+l); //-1
  • (*this)=plomp;
  • rep=true;
  • i+=b.i_taille-1; //new 04/01/04
  • }
  • }
  • }
  • return rep;
  • }
void BString::supprimeOccurence(const BString& test)
{
/// --------------------------------------------------------------------------
/// ---------------- BString::supprimeOccurence(BString test) ----------------
/// --------------------------------------------------------------------------
/// -----  Objectif	: supprimer les occurences d'une sous-chaine ds la chaine stockée
/// -----  PreCond	: /
/// -----  PostCond	: /
/// -----  Etat		: 1			(-1<0<1<2)
/// --------------------------------------------------------------------------
/// -----  BString test	: valeur de test
/// --------------------------------------------------------------------------
/// -----  Var Muettes (cf.partie préc) (1)	: test
/// -----  Var In  (1)	: test
	remplaceAParB(test,"");
}

bool BString::remplacePremierAParB(const BString& a, const BString& b)
{
/// ---------------------------------------------------------------------------------------------
/// ---------------- BString::remplacePremierAParB(BString a ,BString b) -> bool ----------------
/// ---------------------------------------------------------------------------------------------
/// -----  Objectif	: remplacer la 1ere ocurence d'une chaîne par une autre dans celle de la classe
/// -----  PreCond	: /
/// -----  PostCond	: /
/// -----  Etat		: 1			(-1<0<1<2)
/// -----  MaJ 06/08/04 : accélération,cas mm taille....
/// -----  MaJ 18/08/04 : accélération : dbl ptr ,cas taille>.... & memmove !!! & memcpy
/// ---------------------------------------------------------------------------------------------
/// -----  BString a	: chaîne à remplacer
/// -----  BString b	: chaîne de remplacement
/// ---------------------------------------------------------------------------------------------
/// -----  retour (bool)	: cf.obj
/// ---------------------------------------------------------------------------------------------
/// -----  Var Utilisées de la classe (1)	: i_taille
/// -----  Var Muettes (cf.partie préc) (2)	: a ,b
/// -----  Var Internes à la fonction (3)	: i ,l ,plomp
/// -----  Var In  (3)	: a ,b ,i_taille
	unsigned int i,l=a.i_taille;
	if(l==0)
		PB1("BString::remplacePremierAParB\nval à remplacer vide");
	if(l>i_taille)
		return false;
	if(l==b.i_taille)
	{
		for(i=0;i<(i_taille-l+1);i++)
			if(c_chaine[i]==a.c_chaine[0])
			{
				if(l==1||a==deA(i,i+l-1))
				{
					//for(j=0;j<l;j++)c_chaine[i+j]=b.c_chaine[j];
					memcpy(&(c_chaine[i]),b.c_chaine,b.i_taille);//dest,src,taille
					return true;
				}
			}
		return false;
	}
	else
	{
		if(l>b.i_taille) // new 18/08/04
		{
			for(i=0;i<(i_taille-l+1);i++)
				if(c_chaine[i]==a.c_chaine[0])
				{
					//if(l==1||a.operator==(deA(i,i+l-1)))
					if(l==1||a==deA(i,i+l-1))
					{
						//for(j=0;j<b.i_taille;j++)c_chaine[i+j]=b.c_chaine[j];
						memcpy(&(c_chaine[i]),b.c_chaine,b.i_taille);//dest,src,taille
						memmove(&(c_chaine[i+b.i_taille]),&(c_chaine[i+l]),i_taille -i-l+1);//dest,src,taille
						majTaille();
						return true;
					}
				}
		}
			return false;
	}
	BString plomp;
	for(i=0;i<(i_taille-l+1);i++)
		if(c_chaine[i]==a.c_chaine[0])
		{
			plomp=deA(i,i+l-1);
			if(plomp==a)
			{
				BString plomp="";	//masquage !!!
				if(i>0)
					plomp=deA(0,i-1);
				plomp+=b;
				if(i<(i_taille-l))
					plomp+=depuis(i+l);	//-1
				(*this)=plomp;
				return true;
			}
		}
	return false;
}


bool BString::remplaceAParB(const BString a, const BString b, bool recursif)
{
/// -----------------------------------------------------------------------------------------------------
/// ---------------- BString::remplaceAParB(BString a ,BString b ,bool recursif) -> bool ----------------
/// -----------------------------------------------------------------------------------------------------
/// -----  Objectif	: remplacer les ocurences d'une chaîne par une autre dans celle de la classe
/// -----  PreCond	: A pas dans B
/// -----  PostCond	: /
/// -----  Etat		: 1			(-1<0<1<2)
/// -----  MaJ 18/12/03: accélération: non récusrsivité & var de recursivité
/// -----  MaJ 06/08/04 : accélération,cas mm taille....
/// -----  MaJ 18/08/04 : accélération : dbl ptr ,cas taille>.... & memmove !!! & memcpy
/// -----------------------------------------------------------------------------------------------------
/// -----  BString a	: chaîne à remplacer
/// -----  BString b	: chaîne de remplacement
/// -----  bool recursif(par défaut : 'false')	: effectuer recursivement la modif?
/// -----------------------------------------------------------------------------------------------------
/// -----  retour (bool)	: Si au - 1 cht a été effectué
/// -----------------------------------------------------------------------------------------------------
/// -----  Var Utilisées de la classe (1)	: i_taille
/// -----  Var Muettes (cf.partie préc) (3)	: a ,b ,recursif
/// -----  Var Internes à la fonction (4)	: i ,l ,plomp ,rep
/// -----  Var In  (4)	: a ,b ,i_taille ,recursif
	bool rep=false;
	unsigned int i,l=a.i_taille;
	if(l==0)
		PB1("BString::remplaceAParB\nval de test nulle");
	if(recursif)
		while(remplacePremierAParB(a,b))
			rep=true;
	else
	{
		if(l>i_taille)
			return false;
		if(l==b.i_taille)
		{
			for(i=0;i<(i_taille-l+1);i++)
				if(c_chaine[i]==a.c_chaine[0])
				{
					if(l==1 || a==deA(i,i+l-1))
					{
						//for(j=0;i<l;j++)c_chaine[i+j]=b.c_chaine[j];
						memcpy(&(c_chaine[i]),b.c_chaine,b.i_taille);//dest,src,taille
						rep=true;
						i+=l-1;
					}
				}
		}
		else
		if(l>b.i_taille) // new 18/08/04
		{
			/// nota : je C, bruNews, j'aurai pu utilisé des char*, C pareil, non? - B
			//rappel: i:ptr actu sur c_chaine
			//rappel: l=a.i_taille
			for(i=0;i<(i_taille-l+1);i++)
				if(c_chaine[i]==a.c_chaine[0])
				{
					if(l==1||a==deA(i,i+l-1))
					{
						//for(j=0;j<b.i_taille;j++)c_chaine[i+j]=b.c_chaine[j];
						memcpy(&(c_chaine[i]),b.c_chaine,b.i_taille);//dest,src,taille

						/// Nota : peut-etre serait-il plus judicieu de pas faire ce mem move a chaque fois...
						///+		cela ns ralentit il vraiement?
						memmove(&(c_chaine[i+b.i_taille]),&(c_chaine[i+l]),i_taille -i-l+1);//dest,src,taille
						rep=true;
						i+=b.i_taille-1;
					}
					
					
				}
			majTaille();
		}
		else
			for(i=0;i<(i_taille-l+1);i++)
				if(c_chaine[i]==a.c_chaine[0])
				{
					if(l==1 || a==deA(i,i+l-1))
					{
						BString plomp="";
						if(i>0)
							plomp=deA(0,i-1);
						plomp+=b;
						if(i<(i_taille-l))
							plomp+=depuis(i+l);	//-1
						(*this)=plomp;
						rep=true;
						i+=b.i_taille-1;	//new 04/01/04
					}
				}
	}
	return rep;
}



 Sources du même auteur

Source avec Zip [MFC] BCOMBOBOX & BLISTBOX
Source avec Zip Source avec une capture [ C++ WIN32 ] REMPLISSAGE DE FICHE - FENETRE DYNAMIQUE
Source avec Zip Source avec une capture WIN32 - MFC - VC6 - PLACE D'UNE APPLI : BARRE DES TACHES OU ...
Source avec Zip [WIN32] [VC6] BOITE À CHOIX MULTIPLE PAR BOUTONS
Source avec Zip TEMPLATE DE DIALOG/FENETRE (VC++)

 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

Commentaires et avis

Commentaire de Arnotic le 18/08/2004 12:54:51 administrateur CS

Brunews avais mis un code beaucoup plus optimisé. A quoi ca sert de faire lent quand on peut faire rapide ?

Commentaire de DeAtHCrAsH le 18/08/2004 13:27:19

Arnotic> Bonne question ...

Magic_Nono> AU lieu de poster a chaque fois de nouvelles sources, tu pourrais tout simplement mettre a jour celle qui existe deja ;)

Shell

Commentaire de coucou747 le 18/08/2004 13:31:12 administrateur CS

j'avais aussi fait la même chose en C
et j'avais donné un interet amon programme : mettre en pages les conversations amsn (msn messenger pour linux)
J'avais aussi mis en forme les liens...
enfin voila, ce script existait déja ici, le mien s'alellait mep (mise en page) donc fallait envoyer son adresse aux personnes le demandant sur le forum...

Commentaire de magic_Nono le 18/08/2004 15:11:15

TB tous,
ce que les débutant n'arrive pas a faire, c'est s'y retrouver dans la jungle des prog à downloader

on utilise ts ce genre de fonction
et mes bibli seront prochainement maj

habituellement, je met des bibli puis je publie des codes montrant leur utilisation

et visiblement, pour ceux voulant des exe, ces derniers sont les seuls utilisés et pr ceux programmant vraiement, seuls les bibli sont observer ou les résolution de pb particulier comme C le cas ici

j'essaie de contenter tt le monde

Qu: comment optimiseriez vous ce code sans utiliser les stl [cf mes différents post]


++
Magicalement.

Commentaire de Arnotic le 18/08/2004 17:21:01 administrateur CS

Va voir les codes à Brunews pour l'otimisation c'est pas à coup de classe et de string que t'y arriveras.

Commentaire de magic_Nono le 18/08/2004 17:26:21

cool

je m'en oqpe 2 main

ceci dit, G fait un effort, po de bclage intance mais memcpy & memove

C po bien deja???

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

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

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