两种方式:第一种是采用字符数组处理;第二种采用字符串处理(推荐)
第一种方式(自己写的很复杂,中间也不想优化)
思路:写在注释里
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
char sb[200],str[200];
cin>>sb;
getchar();
int i,j,k,p,q,n1,n2,temp;
n2=strlen(sb);
while(cin.getline(str,200)){
n1=strlen(str);
//去除相同字符串
for(i=0;str[i]!='\0';i++){
//查找子串位置
if(str[i]==sb[0]||str[i]+32==sb[0]||str[i]-32==sb[0]){//判断字符是否相等,不区分大小写
temp=1; //设置是否有子串标志
for(k=i,p=0;k<n1&&p<n2;k++,p++){
if(str[k]!=sb[p]&&str[k]+32!=sb[p]&&str[k]-32!=sb[p]){
temp=0; //假如有一项不满足就算没有子串
break;
}
}
//原字符串基础上去除子串
if(temp==1){
for(q=i;str[k]!='\0';q++,k++){
str[q]=str[k];
}
str[q]='\0';
}
}
}
//去除空格
for(i=0;str[i]!='\0';i++){
if(str[i]==' '){
for(q=i;str[q]!='\0';q++){
str[q]=str[q+1];
}
str[q]='\0';
i--; //假如去除之后,这儿还要在原有下标处继续判断
}
}
cout<<str<<endl;
}
}
第二种方式:注意事项是不区分大小写,所以bx函数是将字符串全部变成小写字母,处理后的字符串复制到对应的变量。
string bx(string s){
int n=s.length();
for(int i=0;i<n;i++){
if(s[i]>='A'&&s[i]<='Z'){
s[i]=s[i]+32;
}
}
return s;
}
字符串常考增删改查,主要掌握基本函数:
size()或者length()表示字符串长度
find(字符串或者字符,长度n【可写可不写,默认从开头查找】)返回位置(0,1,2,3,4...),未找到是-1
erase(pos,length)删除
insert(pos,字符串)在pos位置加入字符串
replace(pos,length,字符串)替换函数
完整代码如下:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
string bx(string s){
int n=s.length();
for(int i=0;i<n;i++){
if(s[i]>='A'&&s[i]<='Z'){
s[i]=s[i]+32;
}
}
return s;
}
int main(){
string str,sb,str1,sb1;
cin>>sb;
getchar();
int lsb=sb.length();
while(getline(cin,str)){
str1=str; //把两个输入字符串复制一份
sb1=sb;
str1=bx(str1); //把复制的字符串字母全部变小
sb1=bx(sb1);
while(str1.find(sb1)!=-1){ // 查找复制品中的子串位置,没有的话返回-1
int pos1=str1.find(sb1);
str.erase(pos1,lsb); //在原串中的位置删除,参数含义是从pos1删除长度为lsb的字符串
str1.erase(pos1,lsb); //注意事项!!复制品中也要跟着删除,不然循环条件变成无限循环
}
while(str.find(" ")!=-1){
int pos2=str.find(" ");
str.erase(pos2,1);
}
cout<<str<<endl;
}
}