#include "string.h" #include "malloc.h"
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; isource = (int)strlen(source); isub = (int)strlen(sub); irep = (int)strlen(rep);
if(*sub==NULL) return strdup(source);
//申请结果串需要的空间 int size = (int)( (irep>isub)?(float)strlen(source)/isub*irep+1 : isource ); result = (char *)malloc(size*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++; }
//如果找到了子串,进行以下处理工作 if(*pc3==NULL) { 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 _tmain(int argc, _TCHAR* argv[]) { char Source[] = "abbccdfdcdbbdccd"; char Sub[] = "bb"; char Rep[] = "*****"; char *p = replace(Source, Sub, Rep); printf("Source:%s\n",Source); printf("Sub:%s\n",Sub); printf("Rep:%s\n",Rep); printf("Result:%s\n",p); return 0; } |