一个字符串替代函数strrep的实现

将字符串szSrc中找到的每一个szFind字符串替换为szRep

 *主要思路:若无匹配字符串,返回原字符串。若有,新建一个指针指向关键字符串之后的字符串,截取关键字符串之前的字符串,与Replacement拼接,得到的结果再与关键字符串之后的字符串拼接

注意事项:szRep 中含有 szFind的情况

                    malloc资源的释放


//
//  strrep.c
//
//
//  Created by Lancer on 15-1-14.
//
//

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#undef strrep
#define MAXSIZE 100
#define ERROR 0

int strstr_int(char *s1, const char *s2);
int countFind(char *src, const char *find);
char *strrep(char *szSrc, const char *szFind,  char *szRep);
char *strstr_n(char *s1, const char *s2, int n);

int main()
{
    
    char strSrc[MAXSIZE] = "abc123abc";
    const char *strFind = "abc";
    char *strReplace = "【repabc】";
    
    char strSrc[MAXSIZE] = "";
    printf("请输入 strSrc: \n ");
    gets(strSrc);
    char *strTemp = strSrc;
    printf("原字符串:\t%s \n关键字符串:\t%s \n替代字符串:\t%s \n", strSrc, strFind, strReplace);
    strTemp = strrep(strSrc, strFind, strReplace);
    printf ("替换结果为:\t%s\n", strTemp);
    
}

/**
 * 将字符串szSrc中找到的每一个szFind字符串替换为szRep
 *主要思路:若无匹配字符串,返回原字符串。若有,新建一个指针指向关键字符串之后的字符串,截取关键字符串之前的字符串,与Replacement拼接,得到的结果再与关键字符串之后的字符串拼接
 *@param szSrc 待查字符串
 *@param szFind  关键字符串
 *@param szRep  替换字符串
 *@return: 返回替换后的字符串头指针
 *
 */

char *strrep(char *szSrc, const char *szFind, char *szRep)
{
    char *sTmp = (char *) malloc (MAXSIZE * sizeof(char));
    char *strContinue = szSrc;
    int count = 1;   //记录替换的次数,用于跳过前 count 个匹配关键字
    //int cutEnd = 0;
    strncpy (sTmp, szSrc, strlen (szSrc));
    if (!szFind)
    {
        printf("szFind error!\n");
        return 0;
    }
    int findLen = strlen (szFind);
    printf("strContinue = %p\n", strContinue);
    
    //循环查找替换后的字符串,继续替换
    while (countFind (strContinue, szFind))
    {
        strContinue = strstr (strContinue, szFind) + findLen; //关键字符串之后字符的指针
        
        //判断替换字符串中是否有关键字符串
        if (!countFind(szRep, szFind))
        {
            *(strstr (sTmp, szFind)) = '\0';  //截取前串
        }
        else
        {
            *(strstr_n (sTmp, szFind, count * countFind(szRep, szFind))) = '\0';
        }
        count++;
        strcat (sTmp, szRep);
        strcat (sTmp, strContinue);
    }

    szSrc = strcpy (szSrc, sTmp) ;
    free (sTmp);
    return szSrc;
    
}


/**
 * 在s1中找到s2字符串第一次出现时的字符下标
 *@param s1  待查字符串
 *@param s2  关键字符串
 *@return  返回s1中第一次出现s2字符串时的字符下标
 *
 */

int strstr_int(char *s1, const char *s2)
{
	return (countFind(s1, s2)?(strstr(s1, s2) - s1) : 0) ;
   
}

/**
 *函数描述:在src中统计字符串find出现的个数
 *@param src  待查字符串
 *@param find 关键字符串
 *@return  src中find出现的次数
 *
 */

int countFind(char *src, const char *find)
{
    char *pSrc = src;
    const char *pFind = find;
    char *pSrcEnd = src + strlen (src); //pSrcEnd为src末位置指针
    char *prev = NULL;   //一个用于匹配的临时指针
    int findLen = strlen (find); //len为find的长度
    int count = 0;
    
    //统计关键串出现次数
    for ( ; *pSrc; pSrc++)
    {
        if (pSrcEnd - pSrc < findLen)  break; //若开始匹配串就比原串大,退出
        for (prev = pSrc; *prev == *pFind; prev++, pFind++)
        {
            if (*(pFind + 1) == 0)
            {
                count++;
                pFind = find;
                break;
            }
        }
    }
    return count;
}


/**
 *返回 s1中的第 n 个 s2 字符串的首指针
 *@param s1 待查字符串
 *@param s2 关键字符串
 *@param n  跳过前 n 个字符串
 *@return  s1中的第 n 个 s2 字符串的首指针
 *
 */

char *strstr_n(char *s1, const char *s2, int n)
{
    char *p = s1;
    int findLen = strlen (s2);
    for(; (p = strchr(p, *s2)) != 0; p++)
    {
        if(strncmp (p, s2, findLen) == 0 )
        {
            --n;
            if(!n)
                return (char *)p;
        }
    }
    return 0;
}










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值