7-29 删除字符串中的子串
题目:
输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。
输入格式:
输入在2行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2。
输出格式:
在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串。
输入样例:
Tomcat is a male ccatat
cat
输出样例:
Tom is a male
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
解法一:
#include<stdio.h>
#include<string.h>
int main()
{
char s1[81];
char s2[81];
int i,j,k;
int len;
gets(s1);
gets(s2);
int count;//用来计算s1中是否和s2子串相等长度
i= 0;
len = strlen(s2);
while(s1[i]!='\0')//遍历组数s1
{
if(s1[i]==s2[0])//如果s1i位置与s2初始字符相同,即有可能s1包含s2子串
{
count = 0;
//继续下一位的比较
for(j=i;j<i+len;j++)
{
if(s1[j]==s2[j-i])
{
count++;
}
}
if(count==len)//如果相等结合上面for循环即子串存在
{
for(k=i+len;k<strlen(s1);k++)//把s1存在子串的初始位置替换成,去除s2字串后的字符(删除s1中的s2)
{
s1[k-len]=s1[k];
}
s1[k-len]='\0';//重新设定s1的字符串大小
i = 0;
}
else i++;//不存在s2,查找s1下一个是否匹配
}
else i++;//不存在s2,查找s1下一个是否匹配
}
puts(s1);
return 0;
}
解法二:利用函数
#include<stdio.h>
#include<string.h>
int main()
{
char s1[81];
char s2[81];
char s3[81];//定义一个临时字符数组用于存储s1除去某一次子串s2后面的字符串
gets(s1);
gets(s2);
char *p;//定义一个定位指针,用于指向s2字串,第一次出现在s1的地址
while((p=strstr(s1,s2))!= NULL)
//while循环用来控制,s1中是否存在s2的字串。如果p==NULL则结束循环,无字串,否则p所指的位置就是s2字串第一次出现在s1的位置
{
strcpy(s3,p+strlen(s2));//把s1p所处的位置也就是s2第一次出现在s1的位置+s2字串=跳过s1中s2字串的位置,后面的字符存放在临时数字s3中
*p='\0';//把s1p的位置设置成数组结束的标志,代表此时s1后面的字符已经被删除。
strcat(s1,s3);//此时成立一个新的s1,进入循环判断是否还有字串
}
puts(s1);
return 0;
}