分类:
2008-10-15 16:39:36
#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;
}