题目描述:
输入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
有时间写个总结