这个例子有效,但我认为内存泄漏。简单 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;
}
最佳答案
我可以看到的一个问题是,如果替换字符串包含搜索字符串,您将永远循环(直到内存不足)。
例如:
char *result = str_replace("abc", "a", "aa");
此外,每次替换一个实例时执行另一个 malloc/free 非常昂贵。
更好的方法是对输入字符串进行 2 次传递:
strlen(string) + 匹配*(strlen(replacement)-strlen(substr)) + 1
关于c - 如何替换c中的子字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3659694/