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 :
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
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; }
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 if(!!strncmp(match-1,"=",1) && !!strncmp(match+1,",",1) && !!strncmp(match+1,"\0",1))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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part UPDATE people SET name='Paul',observation='C''est n''importe quoi'
Merci pour votre aide !
Partager