給定三字串 src、oldSub、newSub,將 src 中所有 oldSub 替換為 newSub。例:"abcabcdefghij" 替換 "fgh" 為 "sk" → "abcabcdeskij"。
oldSub 在 src 中出現次數 cnt。newLen = strlen(src) + cnt * (strlen(newSub) - strlen(oldSub)) + 1。src:oldSub → 複製 newSub 到目標,源指針跳過 oldSub 長度。free)。char* str_replace(const char* src, const char* oldSub, const char* newSub) {
if (!src || !oldSub || !newSub || !*oldSub) return strdup(src);
size_t oldLen = strlen(oldSub), newLen = strlen(newSub);
size_t srcLen = strlen(src);
// 統計出現次數
size_t cnt = 0;
for (const char* p = src; (p = strstr(p, oldSub)); p += oldLen) cnt++;
// 分配結果緩衝區
size_t resLen = srcLen + cnt * (newLen >= oldLen ? newLen - oldLen : 0) + 1;
char* res = malloc(resLen);
if (!res) return NULL;
// 執行替換
char* dst = res;
const char* p = src;
while (*p) {
if (strncmp(p, oldSub, oldLen) == 0) {
memcpy(dst, newSub, newLen);
dst += newLen;
p += oldLen;
} else {
*dst++ = *p++;
}
}
*dst = '\0';
return res;
}
oldSub 為空串 → 直接返回原串副本,避免無限迴圈。NULL,呼叫者檢查。strstr 找到最左匹配,替換後繼續掃描,符合標準替換語義。