實現 void fun(char *str, char *substr1, char *substr2, ...),將 str 中所有 substr1 替換為 substr2,統計替換後長度。接口允許在 ... 添加參數(如返回長度指針)。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// 返回替換後長度,str 需指向足夠大的緩衝區或由調用者負責重新分配
// 這裡採用「原地替換,假設緩衝區足夠大」的簡化版本
void fun(char *str, char *substr1, char *substr2, int *newLen) {
if (!str || !substr1 || !substr2 || strlen(substr1) == 0) {
if (newLen) *newLen = strlen(str);
return;
}
size_t len1 = strlen(substr1), len2 = strlen(substr2);
char *p = str, *q;
int count = 0;
// 第一遍:計算替換次數
while ((q = strstr(p, substr1))) {
count++;
p = q + len1;
}
if (count == 0) {
if (newLen) *newLen = strlen(str);
return;
}
// 計算新長度,檢查緩衝區 (此處假設足夠)
size_t oldLen = strlen(str);
size_t newLength = oldLen + count * (len2 - len1);
// 從後向前移動,避免覆蓋未處理數據
char *src = str + oldLen;
char *dst = str + newLength;
*dst-- = '\0';
while (src >= str) {
// 檢查當前位置是否匹配 substr1 結尾
if (src - str >= (long)len1 && memcmp(src - len1 + 1, substr1, len1) == 0) {
// 複製 substr2
for (size_t k = len2; k > 0; --k) *dst-- = substr2[k-1];
src -= len1;
} else {
*dst-- = *src--;
}
}
if (newLen) *newLen = newLength;
}
int main() {
char str1[100] = "abcedfrbcxybc";
char str2[100] = "abcedfrbceybce";
int len;
fun(str1, "bc", "ghi", &len);
printf("結果: %s, 長度: %d\n", str1, len); // aghiedfrghixyghi, 16
fun(str2, "bce", "gh", &len);
printf("結果: %s, 長度: %d\n", str2, len); // aghdfrghygh, 11
return 0;
}
memmove 思路)。... 添加 char **outStr)。原帖「半成品」採用前向掃描 + 臨時緩衝區,邏輯正確但效率較低。上述從後向前原地替換為經典高效寫法。