這個例子可以工作,但我認爲內存泄漏。如果使用此功能,則在簡單Web服務器模塊中使用的功能和共享內存會增加。 如何替換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);')。在這兩種情況下,假設原始腳本不再需要它(或者替換函數中的原始「字符串」並返回void),釋放原始輸入'string'(不是一個很好的參數名稱)會減少內存使用量。 – Rudu 2010-09-07 14:56:29
很誠實,作爲一名程序員,如果我將一個const char *傳遞給一個函數,並且它爲我騰出空間,我會覺得有點被愚弄:) – EboMike 2010-09-07 15:18:36