在C語言中實現字符串替換時,若待替換子字符串與替換字符串長度不同,需處理內存移動與擴容問題。本文提供一個完整的 StrReplace 函數,能處理三種情況:長度相等、替換串較長、替換串較短。
strFind 的起始位置。#include <stdio.h>
#include <string.h>
void StrReplace(char* strSrc, char* strFind, char* strReplace) {
int i, j, k, m;
int lengthSrc = strlen(strSrc);
int lengthFind = strlen(strFind);
int lengthReplace = strlen(strReplace);
for (i = 0; i < lengthSrc; ) {
j = 0;
if (strSrc[i] == strFind[j]) {
do { i++; j++; }
while (j < lengthFind && strSrc[i] == strFind[j]);
if (j == lengthFind) { // 找到匹配
if (lengthFind == lengthReplace) { // 等長
for (k = i - lengthFind, m = 0; m < lengthReplace; k++, m++)
strSrc[k] = strReplace[m];
}
else if (lengthFind < lengthReplace) { // 需擴容
for (k = lengthSrc; k >= i; k--)
strSrc[k + lengthReplace - lengthFind] = strSrc[k];
lengthSrc += lengthReplace - lengthFind;
for (k = i - lengthFind, m = 0; m < lengthReplace; k++, m++)
strSrc[k] = strReplace[m];
i += lengthFind - lengthReplace; // 修正索引
}
else { // lengthFind > lengthReplace,需縮減
for (k = i; k <= lengthSrc; k++)
strSrc[k - (lengthFind - lengthReplace)] = strSrc[k];
lengthSrc -= lengthFind - lengthReplace;
for (k = i - lengthFind, m = 0; m < lengthReplace; k++, m++)
strSrc[k] = strReplace[m];
i -= lengthFind - lengthReplace;
}
}
}
else { i++; }
}
}
int main() {
char strSrc[255], strFind[255], strReplace[255];
gets(strSrc); gets(strFind); gets(strReplace);
StrReplace(strSrc, strFind, strReplace);
puts(strSrc);
return 0;
}
若需同時將“我的”、“他的”替換為“她的”,可在「尋找和替換」對話框中勾選「使用萬用字元」,查找內容輸入 ?的,替換為 她的,點擊「全部替換」即可。
另一種常見需求是從第 m 個字符開始替換 n 個字符。以下代碼演示動態分配臨時緩衝區完成該操作:
#include <stdio.h>
char* exchange(char* first, char* second, int index, int count) {
char *temp = new char[100];
for (int i = 0; i <= index && first[i] != '\0'; i++)
temp[i] = first[i];
int j = 0;
for (; second[j] != '\0'; j++)
temp[index + j] = second[j];
for (int m = 0; first[m] != '\0'; m++)
temp[index + j + m] = first[index + count + m];
return temp;
}