/**
*在有效的字符串内,用新字符串替换指定的字符串,仅执行一次替换操作
*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!