题目:编写程序输入三个字符串,写一函数实现:输入三个字符串,将字符串1中里的字符串2用字符串3代替。
例如:
串1:“abcdefgh123456xy123xyxy”
串2:“1234”
串3:“ABCDE”
处理完后串1变为:"abcdefghABCDE56xy123xyxy"
思路:1.找出串1与串2重叠的位置(从头开始找,找到串1中与串2一一对应的片段,然后定位)
2.定好重复的位置后,利用函数将串1在与串2重复的位置分成两段(例如上题两段分别是“abcdefgh”和“56xy123xyxy”)
好了,思路有了就上源代码吧:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxn 105
int main(int argc, char* argv[])
{
char a[maxn],b[maxn],c[maxn],buf[maxn]={0};
scanf("%s%s%s",a,b,c);
int len2=strlen(b);
int len1=strlen(a);
int first=stringfind(a,b);
if(first!=0)
{
strcut(a,buf,len1,first,len2);
strcat(a,c);
strcat(a,buf);
printf("%s\n",a);
}
return 0;
}
void strcut(char* p,char* buf,int len1,int first,int len2) //strcut函数用来实现思路2
{
int j=0;
int i=first+len2; //这里的i的值是切开后第二个片段的第一个字符的位置
#include <stdlib.h>
#include <string.h>
#define maxn 105
int main(int argc, char* argv[])
{
char a[maxn],b[maxn],c[maxn],buf[maxn]={0};
scanf("%s%s%s",a,b,c);
int len2=strlen(b);
int len1=strlen(a);
int first=stringfind(a,b);
if(first!=0)
{
strcut(a,buf,len1,first,len2);
strcat(a,c);
strcat(a,buf);
printf("%s\n",a);
}
return 0;
}
void strcut(char* p,char* buf,int len1,int first,int len2) //strcut函数用来实现思路2
{
int j=0;
int i=first+len2; //这里的i的值是切开后第二个片段的第一个字符的位置
while((i+j)<len1) (PS:可以多尝试,用debug发现规律)
{
buf[j]=p[i+j];
j++;
}
p[first]='\0';
}
int stringfind(char *m,char *n) //stringfind函数用来实现思路1
{
int i,j;
for(i=0;m[i]!='\0';i++)
{
if(m[i]!=n[0]) continue; //先判断串1中与串2第一个字符'1'相同的位置
j=0;
while(n[j]!='\0'&&m[i+j]!='\0') //再逐个判断串1中的‘1’后面字符是否与串2的一一对应
{
j++;
if(m[i+j]!=n[j])break;
}
if(n[j]=='\0')return i;
}
return 0;
}
{
buf[j]=p[i+j];
j++;
}
p[first]='\0';
}
int stringfind(char *m,char *n) //stringfind函数用来实现思路1
{
int i,j;
for(i=0;m[i]!='\0';i++)
{
if(m[i]!=n[0]) continue; //先判断串1中与串2第一个字符'1'相同的位置
j=0;
while(n[j]!='\0'&&m[i+j]!='\0') //再逐个判断串1中的‘1’后面字符是否与串2的一一对应
{
j++;
if(m[i+j]!=n[j])break;
}
if(n[j]=='\0')return i;
}
return 0;
}