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 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
#include "ed/inc/sys.h"
#include <string.h>
#include <stdio.h>
int STRU_replacestr (char *s, size_t size, const char *toreplace,
const char *replaceby)
{
/* Test sécurité + efficacité */
int count = 0;
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 */
{
/* 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 */
p += toreplacelen;
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;
}
/* Ecriture du caractère courant si besoin */
count++;
}
else
{
if (s != p)
{
*s = *p;
}
s++, p++;
}
}
*s = '\0';
}
return count;
}
int main (void)
{
int n;
char s[10] = "bonjour";
LIM_STR (s);
n = STRU_replacestr (s, sizeof (s), "bon", "contre");
CHK_STR (s);
printf ("n=%d s='%s'\n", n, s);
return 0;
} |
Partager