Fonction : char * ajustertaillechaine()

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 698 fois - Téléchargée 19 fois

Contenu du snippet

Cette fonction permet de retirer une partie de chaine de caractère ou d'espacer la chaine a partir d'un certain point et d'une certaine longueur.

Source / Exemple :


char * AjusterTailleChaine(char * Chaine, long PositionAjustement, long NDeplacement)
{	
	if ((Chaine[0]=='\0')||(PositionAjustement<0))
	{
		return Chaine;
	}
	
	if (NDeplacement==0)
	{
		return Chaine;
	}
	long LongChaine=strlen(Chaine);
	long IndiceGauche;
	long IndiceDroit;
	char* chaineCopie;
	
	if (NDeplacement<0)
	{
		IndiceDroit = 0;
		IndiceGauche = 0 ;
		chaineCopie = (char*) malloc(((strlen(Chaine) + NDeplacement) * sizeof(char)));
		
		while(Chaine[IndiceDroit] != '\0')
		{
			if((IndiceDroit<PositionAjustement)||(IndiceDroit>=PositionAjustement-NDeplacement))
			{
				chaineCopie[IndiceGauche]=  Chaine[IndiceDroit];
				IndiceGauche= IndiceGauche + 1;
			}
			
			
			IndiceDroit= IndiceDroit + 1;			
		}
		chaineCopie[IndiceGauche]=  '\0';//Chaine[IndiceDroit]; // Refermer la chaine par un EOS
		return chaineCopie ;
	}

	if (NDeplacement>0)
	{
		int Taille = strlen(Chaine)-1;
		chaineCopie = (char*) malloc((Taille + NDeplacement) * sizeof(char)); 
		int Indice= Taille;
		strcpy(chaineCopie, Chaine);
		chaineCopie[Indice + NDeplacement + 1] = 0;
		while(Indice >= PositionAjustement )
		{
			chaineCopie[Indice + NDeplacement] =  Chaine[Indice];
			Indice--;			
		}
		for(int i = 0; i < NDeplacement ; i++)
		{
			chaineCopie[PositionAjustement + i] = ' ';
		}
		return chaineCopie;
	
	}
}

A voir également

Ajouter un commentaire Commentaires
Messages postés
4
Date d'inscription
dimanche 2 novembre 2008
Statut
Membre
Dernière intervention
18 mars 2010

le strcpy insère bien '\0'. Je ne fais que retirer le doute de uaip. Sinon je ne vois pas ce qui y a dire de plus que les précédents.

Yuzu
Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011
1
C'est pas faux. Pour se faire, Il peut utiliser return strdup(Chaine);
Messages postés
101
Date d'inscription
samedi 9 février 2002
Statut
Membre
Dernière intervention
5 mai 2009

Hello,

Que fait le client de ta fonction quant à la chaine retournée ? Logiquement, il se doit de faire un free dessus, non ? Or si tu renvois la chaine passée en paramètre comme lorsque tu fais :
if(NDeplacement==0){return Chaine;}
ton client va faire un free de sa propre chaine.
Ça va pas bien se passer :
* soit un double free
* soit un free d'une chaine constante

Il faut que le comportement de ta fonction soit identique quel que soit les arguments. C'est à dire : allouer une chaine dans tous les cas.
Tib.
Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011
1
Salut,
J'ai regardé le code en speed...

if ((Chaine[0]=='\0')||(PositionAjustement<0))
{
return Chaine;
}
if (NDeplacement==0)
{
return Chaine;
}
devient
if ((Chaine[0]=='\0') || (PositionAjustement<0) || (NDeplacement==0)) return Chaine;

if (NDeplacement<0) ...
if (NDeplacement>0) ...
devient
if (NDeplacement<0) ...
else ...
(puisque NDeplacement != 0 dès le départ)

sizeof(char) = 1, si je dis pas de connerie, sous n'importe quel OS
Et tu oublies le +1 dans le malloc, non ?
Et je ne sais plus si strcpy insère le '\0'.

Bref, je dois y aller, bonne continuation.

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.