Cet exemple fonctionne mais je pense que la mémoire fuit. La fonction utilisée dans le module serveur web simple et donc la mémoire partagée augmente si vous utilisez cette fonction. comment remplacer la sous-chaîne dans c?
char *str_replace (const char *string, const char *substr, const char *replacement){
char *tok = NULL;
char *newstr = NULL;
char *oldstr = NULL;
if (substr == NULL || replacement == NULL) return strdup (string);
newstr = strdup (string);
while ((tok = strstr (newstr, substr))){
oldstr = newstr;
newstr = malloc (strlen (oldstr) - strlen (substr) + strlen (replacement) + 1);
memset(newstr,0,strlen (oldstr) - strlen (substr) + strlen (replacement) + 1);
if (newstr == NULL){
free (oldstr);
return NULL;
}
memcpy (newstr, oldstr, tok - oldstr);
memcpy (newstr + (tok - oldstr), replacement, strlen (replacement));
memcpy (newstr + (tok - oldstr) + strlen(replacement), tok + strlen (substr), strlen (oldstr) - strlen (substr) - (tok - oldstr));
memset (newstr + strlen (oldstr) - strlen (substr) + strlen (replacement) , 0, 1);
free (oldstr);
}
return newstr;
}
En toute justice la chaîne existante est toujours copiée et une nouvelle chaîne retournée - soit quand il y a des remplacements ('retour newstr ; ') ou lorsqu'il n'y en a pas (' return strdup (string); '). Dans les deux cas, libérer l'entrée d'origine 'string' (pas un grand nom de paramètre) réduit l'utilisation de la mémoire, en supposant que le script original n'en a plus besoin (ou bien remplacer la chaîne originale dans la fonction et retourner void). – Rudu
Très honnêtement, en tant que programmeur, je me sentirais dupé si je transmettais un const char * à une fonction et que cela me libère :) – EboMike