题目描述:
给定一个短字符串(不含空格),再给定若干字符串,在这些字符串中删除所含有的短字符串。
输入
输入只有1组数据。
输入一个短字符串(不含空格),再输入若干字符串直到文件结束为止。
输出
删除输入的短字符串(不区分大小写)并去掉空格,输出。
//样例
//输入
in
#include
int main()
{
printf(" Hi ");
}
//输出
#clude
tma()
{
prtf("Hi");
}
思路:根据题意,不区分大小写,即有 在主串中删除 in, In ,IN,iN, 。
注意:
1.注意输入,我们可以先读入匹配串,然后一行一行读入主串,然后进行处理。记得在读入完匹配串以后用getchar()吃掉回车键
2.我们思考如何处理,肯定是主串和匹配串中各个英文字符都统计比较好进行对比,比如我们都转化为小写。
但是题目输出要求是非匹配串的字符我们还要将其大小写都原样输出。
所有我们可以复制两个字符串,其中一个s2用于转变大小写然后跟匹配串s1进行匹配删除,另一个字符串s3虽然大小写不做转变,但是s2做什么操作他也做什么操作,如此就删除了s3中的匹配串。
3.对s3进行处理,删除空格。相信大家都会。
4.输出s3.
这里给大家简绍几个函数
tolower();//将字符串中的英文字符转变为小写,如果为非英文字符则不做处理
string s;
s.find(str,pos);//第一个参数为要查找的子串,第二个参数为起始位置。
while(pos!=string::npos)//如此我们可查找主串中所有的子串的起始位置
erase(str,len);//从str中删除长度为len的字符串
#include<bits/stdc++.h>
using namespace std;
int main(){
string s1;
cin>>s1;
for(int i=0;i<s1.size();i++){
s1[i] = tolower(s1[i]);
}
getchar();
int pos;
string s2,s3;
string str;
while(getline(cin,str)){
// getchar();
s3 = s2 = str;
int len = s2.size();
for(int i=0;i<len;i++){//对s2处理,删去对应的s3的位置,最后输出s3,因为输出非匹配串的时候大小写不变
s2[i] = tolower(s2[i]);
}
//删除短字符串
pos = s2.find(s1,0);
while(pos!=string::npos){
s2.erase(pos,s1.size());
s3.erase(pos,s1.size());
pos = s2.find(s1,pos);//更新新的位置
}
//删除空格
pos = s3.find(' ',0);
while(pos!=string::npos) {
s3.erase(pos,1);
pos = s3.find(' ',pos);
}
cout<<s3<<endl;
}
return 0;
}