str_rep功能:將 str 中所有 strSearch 替換為 strReplace,支援替換後長度增減,呼叫端需確保緩衝區足夠大。
char *str_rep(char *str, const char *strSearch, const char *strReplace) {
if (!str || !strSearch || !strReplace) return NULL;
size_t lenSearch = strlen(strSearch), lenReplace = strlen(strReplace);
if (lenSearch == 0) return str; // 避免無限迴圈
char *p = str;
while ((p = strstr(p, strSearch))) {
ptrdiff_t diff = lenReplace - lenSearch;
if (diff > 0) { // 變長:尾部向後搬移
size_t tailLen = strlen(p + lenSearch);
memmove(p + lenReplace, p + lenSearch, tailLen + 1); // 含結束符
} else if (diff < 0) { // 變短:尾部向前搬移
memmove(p + lenReplace, p + lenSearch, strlen(p + lenSearch) + 1);
}
memcpy(p, strReplace, lenReplace);
p += lenReplace; // 繼續搜尋下一處
}
return str;
}
str_sub簡單封裝 strncpy,確保以 \0 結尾。
char *str_sub(char *dest, const char *src, size_t begin, size_t len) {
strncpy(dest, src + begin, len);
dest[len] = '\0';
return dest;
}
char s1[100] = "123456789";
char s2[100];
str_rep(s1, "12", "1212"); // s1 變為 "12123456789"
str_sub(s2, s1, 2, 3); // s2 為 "123"
memmove 處理重疊記憶體搬移,安全可靠。lenReplace,避免重複匹配新產生的子字串(如 str_rep("aaa", "a", "aa"))。lenSearch == 0 直接返回,防止死迴圈。原長度 * (替換長/搜尋長) + 1)。maxLen 參數,防止緩衝區溢位。regex.h)。