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