下面是用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;
}