Chinaunix首页 | 论坛 | 博客
  • 博客访问: 743270
  • 博文数量: 769
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 4985
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-15 16:37
文章分类

全部博文(769)

文章存档

2011年(1)

2008年(768)

我的朋友

分类:

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;
}


--------------------next---------------------

阅读(417) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~