Remplacement de sous-chaînes
Bonjour,
Je créé en ce moment une fonction qui remplace dans une chaîne donnée toutes les occurences d'une sous-chaîne donnée par une autre chaîne, et qui renvoie le nombre d'occurences remplacées. La taille du buffer est également donnée en paramètre.
J'aimerais que dans un cas comme celui-là :
Code:
1 2 3
| int n;
char s[10] = "bonjour";
n = STRU_replacestr(s, sizeof(s), "bon", "contre"); |
s contienne après remplacement "contrejou", avec s[9] contenant '\0', et n valant -1, signifiant que la chaîne a dû être tronquée. C'est cette fonctionnalité que je n'arrive pas à coder.
Voici le corps de la fonction actuelle :
Code:
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;
} |
Avez-vous des suggestions/solutions pour résoudre mon problème ? Merci par avance...