依次读入3个非空字符串:字符串1、字符串2、字符串3,输入的3个字符串最大长度不超过100,且字符串3的长度至少比字符串2的长度少1。
然后在字符串1中搜索是否有子串与字符串2相等,如果相等,则用字符串3替换字符串1中该子串部分。
重复上述搜索与替换过程,直到字符串1中不存在子串与字符串2相等。
输入格式:
输入3个用空格分隔的字符串。
输出格式:
被替换后的字符串1的内容。
输入样例1:
aabcd abc ef
输出样例1:
aefd
输入样例2:
aabcc abc b
输出样例2:
b
以上是题目
我目前只能做出样1的答案
尝试用函数来解决样2失败
想看看大家如何解决
#include <stdio.h>
#include <string.h>
int main() {
char s1[101], s2[101], s3[101];
scanf("%s %s %s", s1, s2, s3);
while (strstr(s1, s2) != NULL) { // 查找s1中是否存在子串与s2相等,使用strstr函数
char new_s1[301] = {0}; // 申请一个新字符串替换s1
char *start = strstr(s1, s2); // 获取s1子串与s2相等的开始位置
int len1 = start - s1; // 获取子串前面的部分所占长度
int len2 = strlen(s2); // 获取子串所占长度
int len3 = strlen(s3); // 获取替换字符串所占长度
strncpy(new_s1, s1, len1); // 将s1子串前面的部分拼接到新字符串
strcat(new_s1, s3); // 将替换字符串拼接到新字符串
strcat(new_s1, s1 + len1 + len2); //将s1子串后面的部分拼接到新字符串
strcpy(s1, new_s1); // 修改s1的值,为新字符串的值
}
printf("%s", s1);
return 0;
}
你的代码拿出来看看
只要写好一个搜索字符串2,并替换为字符串3的函数,然后不断循环,直到找不到字符串2
#include <stdio.h>
int StrLen(char *s)
{
int i=0;
while(s[i] != '\0')
i++;
return i;
}
int FindStr(char *s1,char *s2)
{
int i=0,j,k;
while(s1[i] != '\0')
{
j=0;
k=i;
while(s2[j] != '\0')
{
if(s1[k] != s2[j])
break;
k++;
j++;
}
if(s2[j] == '\0')
return i;
i++;
}
return -1;
}
void ReplaceStr(char *s1,int r,int n,char *s3)
{
int i=0,s=0,j=0;
while(s3[i] != '\0')
{
s1[r+i] = s3[i];
i++;
}
s=r+i;
while(s1[r+n+j] != '\0')
{
s1[s+j] = s1[r+n+j];
j++;
}
s1[s+j] = 0;
}
int main()
{
char s1[1000],s2[101],s3[100];
scanf("%s%s%s",s1,s2,s3);
int r = FindStr(s1,s2);
int len = StrLen(s2);
while(r>=0)
{
ReplaceStr(s1,r,len,s3);
r = FindStr(s1,s2);
}
printf("%s",s1);
}
题目里已经说了字符串3要比字符串2短
那么就不用考虑替换的时候空间会不够用的问题
直接循环赋值过来,或者使用strcpy函数
然后把剩余的部分循环往前挪(删除中间多余的字符)
按理说1比2难啊,1里被替换的有2个字符,2里只有1个字符,怎么反而2不能用呢
你肯定是把“字符串3的长度至少比字符串2的长度少1”理解成“字符串3的长度比字符串2的长度少1”了