7-29 删除字符串中的子串,含strstr的使用

题目描述:
输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。

输入格式:
输入在2行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2。

输出格式:
在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串。

输入样例:
Tomcat is a male ccatat
cat
输出样例:
Tom is a male

在写这个题前先写strstr的使用
1,strstr函数包含在头文件string.h中
2,函数原型char *strstr(const char *str1, const char *str2)
3,*strstr(str1,str2),从字符串str1中查找是否有字符串str2,如果有,从str1中的str2位置起,返回str1中str2起始位置的指针,如果没有,返回null。

关于3我打个栗子

#include<stdio.h>
#include<string.h>
int main()
{
	char *str1="abcde";
	char *str2="cd";
	char *s1=strstr(str1,str2);//str1,str2的值并不改变
	printf("%s",s1);
	return 0;
}

运行结果cde

回到这一题,完整代码

#include<stdio.h>
#include<string.h>
int main()
{
	char s1[100];
	gets(s1);
	char s2[100];
	gets(s2);
	char *p;//p是指针啊!strstr返回的是带指针的地址
	char temp[100];//临时数组
	while((p=strstr(s1,s2))!=NULL)
	//这里不能以括号为真来
	//因为如果s1中没有s2,返回的不是0而是NULL
	//此刻指针p指在s1中s2的第一个字符
	//s1,s2均不改变
	{
		strcpy(temp,p+strlen(s2));
//p是一个指针
//根据定义p是s1中s2起始位置的指针,指针的位置加上s2的长度,能够跳过s2
		*p='\0';
//在while((p=strstr(s1,s2))!=NULL)中
//p的位置在s1中s2第一个字符的开始位置
//令这里的p为结束符
//也就是砍掉了s1中从s2第一个字符开始的所有
		strcat(s1,temp);
		//有了新的s1,进入循环
	}
	puts(s1);
	return 0;
}

反思
strstr不改变s1,s2
strcat改变s1
有时间写个总结

上一篇:算法练习之合并两个有序链表, 删除排序数组中的重复项,移除元素,实现strStr(),搜索插入位置


下一篇:buuctf--[极客大挑战 2019]Secret File 1