这个例子能够工作,但我认为它存在内存泄漏问题。这个函数被用在简单的Web服务器模块中,因此如果你使用这个函数,共享内存会不断增长。
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;
}
return newstr;
)还是没有替换的情况下(return strdup(string);
)。在这两种情况下,释放原始输入的string
(不是很好的参数名称)可以减少内存使用,假设原始脚本不再需要它(或者替代地,在函数中替换原始的string
并返回 void)。 - Rudu