Bonjour à tous,

J'ai créé une petite fonction qui modifie une chaîne de caractères donnée en y supprimant toutes les occurences d'un caractère donné :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* ---------------------------------------------------------------------
   STRU_delchr1 : modifie s en y supprimant toutes les occurences du
   caractère todel.
   ---------------------------------------------------------------------
   @param s : chaîne à modifier
   @param todel : caractère à supprimer
   ---------------------------------------------------------------------
   @return : nombre de caractères supprimés
   --------------------------------------------------------------------- */
unsigned int STRU_delchr(char *s, int todel){
	register char *p;
	unsigned int count = 0U;
	/* Recherche de todel */
	while((p = strchr(s, todel)) != NULL){
		/* Décalage */
		while(*p++ = *(p+1))
			;
		count++;
	}
	return count;
}
Puis j'ai apporté quelques modifications à cette fonction en pensant la rendre un peu plus rapide :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
unsigned int STRU_delchr2(char *s, int todel){
	register char *p, *pOffset;
	unsigned int count = 0U;
	for(p = s; (pOffset = strchr(p, todel)) != NULL; count++){
		p = pOffset;
		while(*pOffset++ = *(pOffset+1))
			;
	}
	return count;
}
Effectivement ici la recherche du caractère par strchr se fait depuis la position courante dans la chaîne et non depuis le début...mais après quelques tests je m'aperçois que c'est la première version de la fonction qui est légèrement plus rapide, pourquoi ?