Этот пример работает, но я думаю, что память течет. Функция, используемая в модуле простого веб-сервера, и, следовательно, общая память увеличивается, если вы используете эту функцию. Как заменить подстроку в 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;
}
В справедливости существующей строка всегда копируются и новая строка возвращается - либо, когда есть замена ('возврат NewStr ; ') или когда нет (' return strdup (string); '). В обоих случаях освобождение исходного ввода 'string' (а не большое имя параметра) сокращает использование памяти, предполагая, что исходный скрипт больше не нуждается в нем (или альтернативно заменяет исходную« строку »в функции и возвращает void). – Rudu
Честно говоря, как программист, я бы почувствовал себя обманутым, если бы передал const char * функции и освободил ее для меня :) – EboMike