加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C语言编写的ReplaceAll函数

发布时间:2020-12-16 07:46:24 所属栏目:百科 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 #include stdio.h#include malloc.h#include string.h char* replaceAll(char* src,char* find,char* replaceWith){ //如果find或者replace为null,则

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

#include <stdio.h>
#include <malloc.h>
#include <string.h>
 
char* replaceAll(char* src,char* find,char* replaceWith){
    //如果find或者replace为null,则返回和src一样的字符串。
    if(find == NULL || replaceWith == NULL){
        return strdup(src);
    }
    //指向替换后的字符串的head。
    char* afterReplaceHead = NULL;
    //总是指向新字符串的结尾位置。
    char* afterReplaceIndex = NULL;
    //find字符串在src字符串中出现的次数
    int count = 0;
    int i,j,k;
     
    int srcLen = strlen(src);
    int findLen = strlen(find);
    int replaceWithLen = strlen(replaceWith);
     
    //指向src字符串的某个位置,从该位置开始复制子字符串到afterReplaceIndex,初始从src的head开始复制。
    char* srcIndex = src;
    //src字符串的某个下标,从该下标开始复制字符串到afterReplaceIndex,初始为src的第一个字符。
    int cpStrStart = 0;
    
    //获取find字符串在src字符串中出现的次数
    count = getFindStrCount(src,find);
    //如果没有出现,则返回和src一样的字符串。
    if(count == 0){
        return strdup(src);
    }
     
    //为新字符串申请内存
    afterReplaceHead = afterReplaceIndex = (char*)malloc(srcLen + 1 + (replaceWithLen - findLen) * count);
    //初始化新字符串内存
    memset(afterReplaceHead,'',sizeof(afterReplaceHead));
 
    for(i = 0,j = 0,k = 0;i!=srcLen;i++){
        //如果find字符串的字符和src中字符串的字符是否相同。
        if(src[i] == find[j]){
            //如果刚开始比较,则将i的值先赋给k保存。
            if(j == 0){
                k = i;
            }
            //如果find字符串包含在src字符串中
            if(j == (findLen-1)){
                j = 0;
                //拷贝src中find字符串之前的字符串到新字符串中
                strncpy(afterReplaceIndex,srcIndex,i - findLen - cpStrStart + 1);
                //修改afterReplaceIndex
                afterReplaceIndex = afterReplaceIndex + i - findLen - cpStrStart + 1;
                //修改srcIndex
                srcIndex = srcIndex + i - findLen - cpStrStart + 1;
                //cpStrStart
                cpStrStart = i + 1;            
 
                //拷贝replaceWith字符串到新字符串中
                strncpy(afterReplaceIndex,replaceWith,replaceWithLen);
                //修改afterReplaceIndex
                afterReplaceIndex = afterReplaceIndex + replaceWithLen;
                //修改srcIndex
                srcIndex = srcIndex + findLen;
            }else{
                j++;
            }
        }else{
            //如果find和src比较过程中出现不相等的情况,则将保存的k值还给i
            if(j != 0){
                i = k;
            }
            j = 0;
        }
    }
    //最后将src中最后一个与find匹配的字符串后面的字符串复制到新字符串中。
    strncpy(afterReplaceIndex,i - cpStrStart);
     
    return afterReplaceHead;
}
 
int getFindStrCount(char* src,char* find){
    int count = 0;
    char* position =src;
    int findLen = strlen(find);
    while((position = strstr(position,find)) != NULL){
        count++;
        position = position + findLen;
    }
    return count;
}
 
int main(void){
    char* s = "12345345443344341334542345";
    //调用函数replaceAll,s为源字符串,"345"为需要替换的字符串,”7890“为替换目的字符串。
    char* r = replaceAll(s,"345","7890");
    printf("%sn",r);
    //使用replaceAll函数后一定要free掉,因为replace内部会malloc结果字符串的内存。
    free(r);
    return 0;
}

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读