下面是用C語言實現字符串替換功能的代碼:
char *replace(char *source, char *sub, char *rep)
{
char *result;
/*pc1 是復制到結果result的掃描指針*/
/*pc2 是掃描 source 的輔助指針*/
/*pc3 尋找子串時,為檢查變化中的source是否與子串相等,是指向sub的掃描指針 */
/*找到匹配後,為了復制到結果串,是指向rep的掃描指針*/
char *pc1, *pc2, *pc3;
int isource, isub, irep;
isub = strlen(sub); /*對比字符串的長度*/
irep = strlen(rep); /*替換字符串的長度*/
isource= strlen(source); /*源字符串的長度*/
if(NULL == *sub)
return strdup(source);
/*申請結果串需要的空間*/
result = (char *)malloc(( (irep > isub) ? (float)strlen(source) / isub* irep+ 1:isource ) * sizeof(char));
pc1 = result; /*為pc1依次復制結果串的每個字節作准備*/
while(*source != NULL)
{
/*為檢查source與sub是否相等作准備,為pc2,pc3 賦初值*/
pc2 = source;
pc3 = sub;
/* 出循環的(任一)條件是:
* *pc2 不等於 *pc3 (與子串不相等)
* pc2 到源串結尾
* pc3 到源串結尾 (此時,檢查了全部子串,source處與sub相等)
*****************************************************/
while(*pc2 == *pc3 && *pc3 != NULL && *pc2 != NULL)
pc2++, pc3++; [Page]
/* 如果找到了子串,進行以下處理工作*/
if(NULL == *pc3)
{
pc3 = rep;
/*將替代串追加到結果串*/
while(*pc3 != NULL)
*pc1++ = *pc3++;
pc2--;
source = pc2;
/* 檢查 source與sub相等的循環結束後,
* pc2 對應的位置是在 sub 中串結束符處。該是源串中下一個位置。
* 將 source 指向其前面一個字符。
***************************************************/
}
else /*如果沒找到子串,下面復制source所指的字節到結果串*/
*pc1++ = *source;
source++; /* 將source向後移一個字符*/
}
*pc1 = NULL;
return result;
}
以下為測試代碼:
int main()
{
char s1[] ="abbccdfdcdbbdcd";
char s2[]="dcd";
char s3[]="12345";
char *p = replace(s1,s2,s3);
printf("source=%s\n",s1);
puts(s1);
printf("sub = %s\n",s2);
puts(s2);
printf("replace string = %s",p);
return 0;
}