常见C语言面试题之三:字符串替代

来源:互联网 发布:淘宝怎么自定义尺码 编辑:程序博客网 时间:2024/05/16 01:33
  1. #include "stdafx.h"
  2. #include "string.h"
  3. #include "malloc.h"
  4. char *replace(char *source, char *sub, char *rep)
  5. {
  6.   char *result;
  7.   //*pc1是复制到结果result的扫描指针
  8.   //*pc2是扫描source 的辅助指针
  9.   //*pc3寻找子串时,为检查变化中的source是否与子串相等,是指向sub的扫描指针
  10.   //找到匹配后,为了复制到结果串,是指向rep的扫描指针
  11.   char *pc1,*pc2,*pc3;
  12.   int isource, isub, irep;
  13.   isource = (int)strlen(source);
  14.   isub = (int)strlen(sub);
  15.   irep = (int)strlen(rep);
  16.   if(*sub==NULL)
  17.     return strdup(source);
  18.   //申请结果串需要的空间
  19.   int size = (int)( (irep>isub)?(float)strlen(source)/isub*irep+1 : isource );
  20.   result = (char *)malloc(size*sizeof(char));
  21.   pc1=result;//为pc1依次复制结果串的每个字节作准备
  22.   while(*source !=NULL)
  23.   {
  24.     //为检查source与sub是否相等作准备,为pc2,pc3 赋初值
  25.     pc2=source;
  26.     pc3=sub;
  27.     //出循环的(任一)条件是:
  28.     //*pc2不等于*pc3(与子串不相等)
  29.     //*pc2到源串结尾
  30.     //*pc3到源串结尾(此时,检查了全部子串,source处与sub相等)
  31.     while(*pc2==*pc3 && *pc3!=NULL && *pc2!=NULL)
  32.     {
  33.       pc2++;pc3++;
  34.     }
  35.     //如果找到了子串,进行以下处理工作
  36.     if(*pc3==NULL)
  37.     {
  38.       pc3=rep;
  39.       //将替代串追加到结果串
  40.       while(*pc3!=NULL)
  41.       {
  42.         *pc1++ = *pc3++;
  43.       }
  44.       pc2--;
  45.       source=pc2;
  46.       //检查source与sub相等的循环结束后
  47.       //* pc2 对应的位置是在sub 中串结束符处。该是源串中下一个位置。
  48.       //将 source 指向其前面一个字符。
  49.     }
  50.     else   //如果没找到子串,下面复制source所指的字节到结果串
  51.     {
  52.       *pc1++ = *source;
  53.     }
  54.     source++; //将source向后移一个字符
  55.   }
  56.   *pc1=NULL;
  57.   return result;
  58. }
  59. int _tmain(int argc, _TCHAR* argv[])
  60. {
  61. char Source[] = "abbccdfdcdbbdccd";
  62.   char Sub[] = "bb";
  63.   char Rep[] = "*****";
  64.   char *p = replace(Source, Sub, Rep);
  65.   printf("Source:%s/n",Source);
  66.   printf("Sub:%s/n",Sub);
  67.   printf("Rep:%s/n",Rep);
  68.   printf("Result:%s/n",p);
  69.   return 0;
  70. }
 
原创粉丝点击