这个c语言题目怎么在子函数里换字符串?
展开全部
图片看得并不是太清楚
大概看清是字符串替换
其实字符串替换注意的就是替换后的长度与替换前长度的不同
如果替换后的长度比替换前的长度要长则原有存储字符串的数组就会溢出
所以需要替换时动态更改数组大小
下面是我曾经写的一个简单的代码
它可以进行字符串替换
并且还简单地支持正则表达式来对字符串进行替换
#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;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询