题目 1728: 字符串的查找删除

两种方式:第一种是采用字符数组处理;第二种采用字符串处理(推荐)

第一种方式(自己写的很复杂,中间也不想优化)

思路:写在注释里

#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;
	}
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值