Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1159050
  • 博文数量: 221
  • 博客积分: 10152
  • 博客等级: 上将
  • 技术积分: 1518
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-22 10:42
文章分类

全部博文(221)

文章存档

2018年(1)

2015年(6)

2014年(3)

2013年(4)

2012年(1)

2011年(5)

2010年(14)

2009年(10)

2008年(28)

2007年(33)

2006年(114)

2005年(2)

我的朋友

分类: C/C++

2007-02-08 14:30:33

#include
#include
#include

/**
 *
 * @author: cnscn@163.com
 * @reference: lovesnow1314@
 *
 * 用新子串newstr替换源字符串src中的前len个字符内所包含的oldstr子串
 *
 * @param       char* dest   目标串,也就是替换后的新串
 * @param const char* src    源字符串,被替换的字符串
 * @param const char* oldstr 旧的子串,将被替换的子串
 * @param const char* newstr 新的子串
 * @param       int   len    将要被替换的前len个字符
 *
 * @return char* dest  返回新串的地址
 *
 */
char *strreplace(char *dest, char *src, const char *oldstr, const char *newstr, size_t len)
{
    //如果串相等,则直接返回
    if(strcmp(oldstr, newstr)==0)
       return src;

    //子串位置指针
    char *needle;

    //临时内存区
    char *tmp;

    //把源串地址赋给指针dest,即让dest和src都指向src的内存区域
    dest = src;

    //如果找到子串, 并且子串位置在前len个子串范围内, 则进行替换, 否则直接返回
    while((needle = strstr(dest, oldstr)) && (needle -dest <= len))
    {
        //分配新的空间: +1 是为了添加串尾的'\0'结束符
        tmp=(char*)malloc(strlen(dest)+(strlen(newstr)-strlen(oldstr))+1);

        //把src内的前needle-dest个内存空间的数据,拷贝到arr
        strncpy(tmp, dest, needle-dest);

        //标识串结束
        tmp[needle-dest]='\0';

        //连接arr和newstr, 即把newstr附在arr尾部, 从而组成新串(或说字符数组)arr
        strcat(tmp, newstr);

        //把src中 从oldstr子串位置后的部分和arr连接在一起,组成新串arr
        strcat(tmp, needle+strlen(oldstr));

        //把用malloc分配的内存,复制给指针retv
        dest = strdup(tmp);

        //释放malloc分配的内存空间
        free(tmp);
    }

    return dest;
}

int main()
{
   char *str="wo i love iyou";
   char *old="i";
   char *new="ILOVEYOUYA";

   char *dest;
   //分配内存空间: 大小 == src的长度 + newstr和oldstr长度差(可能是正负或0)+1
   printf("%s\n",strreplace(dest, str, old, new,1));
   printf("%s\n",strreplace(dest, str, old, new,5));
   printf("%s\n",strreplace(dest, str, old, new,40));

   return 0;
}


[root@localhost ~]# ./strreplace
wo i love iyou
wo ILOVEYOUYA love iyou
wo ILOVEYOUYA love ILOVEYOUYAyou
阅读(3820) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-03-10 16:08:57

此例程错误至少5处,可以作为初学者的反面教材