编写函数replace(char *str,char *fstr,char *rstr),将str所指字符串中凡是与fstr字符串相同的字符替换成rstr(rstr与fstr的字符长度不一定相同)。从主函数中输入原始字符串"iffordowhileelsewhilebreak"、查找字符串"while"和替换字符串"struct",调用函数得到结果。
方案一【创建目的串】:
#include "stdio.h"
#include "string.h"
void replace(char *str,char *fstr,char *rstr){
char dest[100]={0};
int flag=0,i,j,k;
for (i=0; i <strlen(str);i++){
for (j=i,k=0;fstr[k]==str[j];k++,j++);
if (fstr[k]=='\0') {
flag=1 ;
}
if (flag==1){//找到一个源子串,用目的子串替换
strcat(dest,rstr);
i=i+k-1;
flag=0;
}else{//没找到源子串,将源串中该部分字符复制到目的串
int l=strlen(dest);
dest[l]=str[i];
}
}
strcpy(str,dest);
}
int main()
{ char str[100],fstr[10],rstr[10];
gets(str);
gets(fstr);
gets(rstr);
replace(str,fstr,rstr);
puts(str);
return 0;
}
方案二【直接在原字符串上进行修改】:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
/*函数功能:替换字符*/
void replace(char* str, char* fstr, char* rstr)
{
int i, j, k;
int len_str = strlen(str);
int len_fstr = strlen(fstr);
int len_rstr = strlen(rstr);
for (i = 0; i <= len_str - len_fstr; i++)
{
for (j = 0; j < len_fstr; j++)
{
if (str[i + j] != fstr[j])
break;
}
if (j == len_fstr) //若原字符串中出现与fstr相同的字符
{
memmove(str + i + len_rstr, str + i + len_fstr, len_str - i - len_fstr + 1); //将原始字符串除与fstr相同部分后移
memcpy(str + i, rstr, len_rstr); //将rstr拷贝到原始字符串中
i += len_rstr - 1; // 跳过已替换的部分
len_str = len_str - len_fstr + len_rstr;
}
}
}
int main()
{
char str[100], fstr[10], rstr[10];
scanf("%s", str);
scanf("%s", fstr);
scanf("%s", rstr);
replace(str, fstr, rstr); //调用函数替换字符
printf("%s\n", str);
return 0;
}