C 用新字符串替换某字符串里的指定字符

/**
*在有效的字符串内,用新字符串替换指定的字符串,仅执行一次替换操作
*str:    待替换的字符串源
*oldstr: 被替换的字符串
*newstr: 用于替换的新字符串
*result: 参数输出执行替换后的结果(可用该函数返回值,也可用result参数接收替换后的结果)
**/
char *strrpc(char *str,char *oldstr,char *newstr,char *result){
    int len=0;
    int len1=strlen(oldstr);
    int len2=strlen(newstr);
    int n=0,m=0,isReset=0;
    char *str1=NULL;

    if(NULL==result){
        len=strlen(str)+1;
        n=(len-len1+len2)*sizeof(char);
        result=(char *)malloc(n);
    }
    else{
        isReset=1;
        len=strlen(result)+1;
        n=(len-len1+len2)*sizeof(char);
        result=(char *)realloc(result,n);

        str1=(char *)malloc(len*sizeof(char));
        for(int x=0;x<len;x++){
            *(str1+x)=*(result+x);
        }
    }
    
    if(0==isReset){
        m=indexof(str,oldstr);
    }
    else{
        m=indexof(str1,oldstr);
    }
    
    if(-1!=m){
        int i=0;
        for(i=0;i<m;i++){
            if(0==isReset){
                *(result+i)=*(str+i);
            }
            else{
                *(result+i)=*(str1+i);
            }
        }

        for(i=0;i<len2;i++){
            n=i+m;
            *(result+n)=*(newstr+i);
        }

        n=m+len2;
        len2=m+len1;
        
        for(i=len2;i<len;i++){
            if(0==isReset){
                *(result+n)=*(str+i);
            }
            else{
                *(result+n)=*(str1+i);
            }
            n++;
        }
    }
    else{
        result=(char *)realloc(result,len*sizeof(char));
        for(int j=0;j<len;j++){
            if(0==isReset){
                *(result+j)=*(str+j);
            }
            else{
                *(result+j)=*(str1+j);
            }
        }
    }

    if(1==isReset){
        free(str1);
        str1=NULL;
    }
    
    return result;
}

/**
*从左向右查找指定的字符串,如果查找到返回首次出现的位置,如果没有查找到返回-1
*str:  字符串源
*tstr: 待查找的字符串
**/
int indexof(char *str,char *tstr){
    int len=strlen(str);
    int len1=strlen(tstr);
    int n=0,m=0;

    char a,b,c;
    
    a=*tstr;
    n=0;
    
    int i=0;
    int isCmp=-1;
    while(i<len){
        b=*(str+i);
        if((a==b&&0==n)||c==b){
            if(a==b&&0==n)m=i;
            if((n+1)==len1){
                isCmp=m;
                break;
            }
            n++;
            i++;
            c=*(tstr+n);
        }
        else{
            if(0<m)i=m;
            i++;
            n=0;
            m=0;
        }
    }
    return isCmp;
}

/**
*在有效的字符串内,用新字符串替换指定的字符串,替换所有匹配上的字符串
*str:    待替换的字符串源
*oldstr: 被替换的字符串
*newstr: 用于替换的新字符串
*result: 参数输出执行替换后的结果
**/
char *strreplace(char *str,char *oldstr,char *newstr,char *result){
    int n=indexof(str,oldstr);
    while(-1!=n){
        result=strrpc(str,oldstr,newstr,result);
        n=indexof(result,oldstr);
    }

    return result;
}

例:

char *result=NULL;

char *s="Hello world!";

strrpc(s,"o","O",result);

printf("%s",result); //输出结果: HellO world!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值