Bonjour,

En guise de fonction chercher/remplacer, j'ai utilisé celle donnée ici : http://www.daniweb.com/code/snippet216517.html

La chaine de caractère que je veux modifier est en fait une requête pour une base de données Sqlite. Dans cette requête, je veux doubler les apostrophes au milieu des mots mais pas les apostrophes qui délimitent chaque entrée. Pour cela, j'ai voulu tester si l'apostrophe était derrière un signe '=', devant une virgule ou à la fin de la chaine et dans ce cas, sauter l'occurence.

J'avais donc modestement pensé écrire ceci :
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
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 
char *str_replace(const char *src, const char *from, const char *to)
{
  size_t size = strlen(src) + 1;
  size_t fromlen = strlen(from);
  size_t tolen = strlen(to);
  char *value = malloc(size);
  char *dst = value;
 
  if ( value != NULL )
    {
      for( ;; )
	{
	  const  char *match = strstr(src, from);
          //Si une occurence est trouvée, on teste le caractère précédent et le suivant pour savoir si on réalise le remplacement de from par to
	  if (match != NULL && !!strncmp(match-1,"=",1) && !!strncmp(match+1,",",1) && !!strncmp(match+1,"\0",1))
	    {
	      size_t count = match - src;
	      char *temp;
	      size += tolen - fromlen;
	      temp = realloc(value, size);
	      if (temp == NULL)
		{
		  free(value);
		  return NULL;
		}
	      dst = temp + (dst - value);
	      value = temp;
	      memmove(dst, src, count);
	      src += count;
	      dst += count;
	      memmove(dst, to, tolen);
	      src += fromlen;
	      dst += tolen;
	    }
	  else
	    {
	      strcpy(dst, src);
	      break;
	    }
	}
    }
  return value;
}
Mais la condition du 2e if ne semble jamais remplie. Or en testant juste la partie :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
 if(!!strncmp(match-1,"=",1) && !!strncmp(match+1,",",1) && !!strncmp(match+1,"\0",1))
J'obtiens bien la réponse voulue, c'est-à-dire que j'obtiens bien les valeurs TRUE et FALSE aux bons moments suivant les différentes occurences de la chaine testée. Une chaine qui pourrait être par exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
UPDATE people SET name='Paul',observation='C'est n'importe quoi'
Deviendrait :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
UPDATE people SET name='Paul',observation='C''est n''importe quoi'
Je ne comprends pas pourquoi ce n'est pas le cas dans la fonction complète et j'ai donc besoin de votre aide pour savoir ce que je fais mal.

Merci pour votre aide !