2016-07-14 62 views
-1

我有這樣的功能:爲什麼替換某個角色的函數只能對角色的第一個實例執行此操作?

char *replace_str(char *str, char *orig, char *rep) 
{ 
static char buffer[4096]; 
char *p; 

if(!(p = strstr(str, orig))) 
    return str; 

strncpy(buffer, str, p-str); 
buffer[p-str] = '\0'; 

sprintf(buffer+(p-str), "%s%s", rep, p+strlen(orig)); 

return buffer; 
} 

當我使用它,它只是改變了角色的第一個實例進行更換。有什麼辦法可以讓它對所有說過的角色做到這一點?

+3

是。重複替換,直到所有應該替換的內容都被替換。 – MikeCAT

+0

大聲笑。只注意到我多麼多餘了。謝謝;) –

+0

注意,如果'rep'不超過'orig'.'長這種方法只適用。 – FredK

回答

1

如果我理解正確的話,你需要一個循環,你的替換字符串的結束後重新分配字符串的開頭。事實上,你的函數只執行一次這個動作,因爲strstr返回一個指向str中第一個出現的單詞orig的指針。

編輯:這可能給你如何做到這一點的想法。我無法在這臺電腦上測試它,所以它可能無法直接使用。 我做到了使用malloc,因爲靜態的字符不應該用這樣的方式,在我看來。它應該將這些值存儲在緩衝區中以備將來使用該功能。如果你重新使用這個函數,你將失去函數以前的返回值... 這是我做這件事的方式,當然有一種更有效的方法。這個功能的優點是它適應任何字符串長度。

char *replace_str(char *str, char *orig, char *rep) 
{  
    char *buffer; 
    char *previous_version; 
    char *p; 
    size_t occurring_position; 

    if (strcmp(orig, rep) == 0) 
    { 
    return(str); 
    }   
    buffer = strdup(str); 
    while ((p = strstr(buffer, orig))) 
    { 
    occuring_position = p - buffer; 
    previous_version = strdup(buffer); 
    free(buffer); 
    buffer = malloc(strlen(previous_version) + strlen(rep) - strlen(orig)); 
    strcnpy(buffer, previous_version, occurring_position); 
    strcpy(buffer, rep); 
    strcpy(buffer + occurring_position + strlen(rep), previous_version + occurring_position + strlen(orig)); 
    free(previous_version); 
    } 
    return (buffer); 
} 
+0

感謝您的回答。我不確定我是否正確實施它。我該在哪裏放置?這是完全刪除我想的字符串。 –

+0

@Damien什麼是「緩衝區」? 4096從哪裏來?啊 - 現在我在原始代碼中看到它,但不是在你的答案中。 – FredK

相關問題