这个c语言题目怎么在子函数里换字符串?

 我来答
阿尔迈凡
2016-01-10 · TA获得超过8460个赞
知道大有可为答主
回答量:5744
采纳率:14%
帮助的人:2014万
展开全部

图片看得并不是太清楚

大概看清是字符串替换

其实字符串替换注意的就是替换后的长度与替换前长度的不同

如果替换后的长度比替换前的长度要长则原有存储字符串的数组就会溢出

所以需要替换时动态更改数组大小


下面是我曾经写的一个简单的代码

它可以进行字符串替换

并且还简单地支持正则表达式来对字符串进行替换

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

char *strrep(const char *str,const char *need,const char *repto,int sub)
{
    pcre *re;
    const char *errptr;
    int erroffset;
    int *ovector;

    int src_len=strlen(str); //要处理的字符串的长度
    int rep_len=strlen(repto); //要替换的字符串的长度
    int offset=0; //匹配后在字符串中的偏移量

    char *res=NULL; //保存最终结果
    int res_len=0; //替换后的字符串的长度
    int len; //当前已替换后的字符串的长度
    char *temp; //临时变量

    if((ovector=malloc(sizeof(int)*(sub+1)*3)) == NULL) //开辟足够大的内存来保存匹配后的偏移量
        return NULL;

    if((re=pcre_compile(need,0,&errptr,&erroffset,NULL)) == NULL)
        return NULL;

    while(pcre_exec(re,NULL,str,src_len,offset,0,ovector,(sub+1)*3) > 0)  //循环匹配,不然只能匹配到一个结果
    {
        res_len+=ovector[sub*2]-offset+rep_len; //计算当前替换后字符串的长度
        
        if(res)
        {
            len=strlen(res);

            temp=malloc(sizeof(char)*len+1);
            snprintf(temp,len+1,"%s",res);
            free(res); //临时保存之前替换的结果

            res=malloc(sizeof(char)*res_len+1);
            snprintf(res,len+1,"%s",temp);
            free(temp); //增大内存

            strncat(res,str+offset,ovector[sub*2]-offset); //将不需要替换的字符串复制
            strncat(res,repto,rep_len); //进行替换
        }
        else
        {
            res=malloc(sizeof(char)*res_len+1); //第一次匹配
            snprintf(res,ovector[sub*2]+1,"%s",str); //复制不需要替换的字符串
            strncat(res,repto,rep_len); //进行替换
        }

        offset=ovector[sub*2+1]; //增加偏移量,进行下一循环
    }

    if(offset != 0 && offset < src_len) //如果所替换的字符串后面还有数据则进行复制
    {
        temp=malloc(sizeof(char)*res_len+1);
        snprintf(temp,res_len+1,"%s",res);
        free(res);

        res=malloc(sizeof(char)*res_len+src_len-offset+1);
        snprintf(res,res_len+src_len-offset+1,"%s%s",temp,str+offset);
        free(temp);
    }

    pcre_free(re); //这里的两个地方是让我头痛了一阵的地方,释放的时候总是出现不“科学”的事情,后来发现是开辟内存时没有指定类型导致出错(前面的sizeof)这里特意注释下
    free(ovector);

    return res;
}

int main(int argc,char **argv)
{
    char *res;
    const char *src="<title>1234</title>456</title><title>789</title><title>fjdsklfjdsklf</title>";

    res=strrep(src,"<title>(.*?)</title>","替换后的结果",1);

    if(res == NULL)
        printf("%s\n",src);
    else
    {
        printf("%s\n",res);
        free(res);
    }

    return 0;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式