1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| int STRU_replacestr(char *s, size_t size, const char *toreplace, const char *replaceby){
int count = 0;
/* Test sécurité + efficacité */
if(s && toreplace && replaceby && (s = strstr(s, toreplace))){
char *p = s;
const char *preplace = NULL;
size_t toreplacelen = strlen(toreplace);
long diff = (long)(strlen(replaceby) - strlen(toreplace));
while(*p != '\0'){
/* p est la sous-chaîne recherchée */
if(*p == *toreplace && strncmp(p+1, toreplace+1, toreplacelen-1) == 0){
/* On place le curseur après la sous-chaîne */
p += toreplacelen;
/* Si la chaîne de remplacement est plus grande que celle à remplacer, */
/* on décale les caractères pour laisser la place manquante et on place */
/* le curseur à la suite de la place libérée */
if(diff > 0){
memmove(p + diff, p, strlen(p)+1);
p += diff;
}
/* Ecriture de la sous-chaîne remplaçante */
for(preplace = replaceby; *preplace != '\0'; s++, preplace++){
*s = *preplace;
}
count++;
/* Ecriture du caractère courant si besoin */
} else {
if(s != p){
*s = *p;
}
s++, p++;
}
}
*s = '\0';
}
return count;
} |
Partager