c基础——string部分函数的小结

君子进德修业,欲及时也

文章目录

一、c

函数功能实现原理
gets(字符数组)接受字符串
puts(字符数组)输出字符串的函数
strcat(字符数组1,字符数组2)把字符串2连接到字符串1后面使用双指针,指针1指向字符串1的末地址,指针2指向数组2的首地址 然后指针移动
strcpy(字符数组1,字符数组2)把字符串2复制到字符数组1中使用双指两个都指向头,但是要注意数组1的长度要够长,数组2!=NULL
strcpy(字符数组1,字符数组2,数字n)0<=n<=2.size
strcmp(字符数组1,字符数组2)字符串比较函数(c中还不能使用等号来比较字符串)
strcmp(字符数组1,字符数组2,n)选择字符串2中的前n个字符与1进行比较,函数有返回值>0或<0使用双指针都指向第一个字符开始比较
strlen(字符数组)测量字符串的长度1计数器法,2.指针减指针法
strlwr(字符串)将字符串中的大写转化为小写字母
strupr(字符串)转化为大写的函数
strstr(字符串1,字符串2)判断字符串2是不是字符串1的字串,若是返回首次出现地址,若不是则返回null这个有好几种方式(后面文章会介绍),目前你可以使用最简单的一种也就是暴力解法,使用双指针,逐个对比

二、c++

函数功能实例
1、str.begin()返回首地址的迭代器str.begin()
2、string(const char *s)将string对象初始化为s指向的字符串string str(“hello”);
3、string(size_type n,char c)创建一个包含n个元素的string对象 每个元素都被初始化cstring str(10,‘a’);
4、string(const string&str)将一个string对象初始化为string对象 strstring str(“abc”);string str2(str);
5、string():创建一个默认的string对象,默认长度是0string str;
6使用c语言风格字符串处理string对象string str=“110011”;
7、str.length()/str.size()获取字符串的长度string str(“你好”);int len1=str.length()/int len2=str.size();
8、=将一个string对象赋值给另外一个string 对象string str1(“nihao”);string str2(“hello”);str1=str2;
9、+或str.append()在string对象后面添加一个string对象str.append(str1);/str+=str1
10、sting.push_back()在string对象后面附加一个字符char ch=‘a’ str.push_back(ch)
11、==或str.compare()string对象的比较str1.compare(6,3,str2,6,3);其中str2不能省略
12、str.substr()获取字串,从某位置开始截取保留str2=str1.substr(3,2)
13、str.find()从指定位置开始,返回该字符串或字符首次出现时其首字符的索引int rank=str.find(str1,3,6);第一个数字表示起始位置 (默认是起始位置)第二个数字表示字符串长度(默认全长)
14、str.rfind()从指定位置向后,查找子字符转或字符最后一次出现的位置int rrank=str.find(6,str1)默认是末尾位置
15、str.find_first_of()从指定位置开始向后查找参数中任何一个字符首次出现的位置(有点像模糊搜索的感觉)string str(“hello world”); int rank=str.find_first_of(“abcd”,1)
16、str.find_last_of()查找参数中任何一个字符最后一次出现的位置string str(“hello world”); int rank=str.find_last_of(“abcd”,1)
17、str.find_first_not_of()从指定位置开始向后查找一个不包含参数的字符串的位置string str(“hello world”); int rank=str.find_first_not_of(“abcd”,1)
18、str.find_last_not_of()从后向前查找第一个不包含参数的字符串的位置string str(“hello world”); int rank=str.find_last_not_of(“abcd”,1)
19、str.insert()从某特定位置插入字符串(其中参数也可以从某特定的位置开始选择sublen个字符) 返回值是一个字符串,不是从特定位置 而是从一个迭代器开始则返回值也是一个迭代器stirng str1=insert(size_t 20、pos,string,subpos,sublen)或iterator insert(const_iterator p,size_t n,char c)
21、str.erase()进行元素的删除操作返回值可以是迭代器 也可以是字符串string erase(szie_t post=0,len=npos)删除从某位置开始的n个单位,返回值是一个字符串,iterator erase(const_iterator first,const_iterator last);返回的是迭代器的位置
22、getline(cin,str)来获取string的输入
23、str.empty()函数判断字符串是否为空若是为空返回true ,否则返回false
24、str.swap(str)交换两个字符串str1.swap(str2);
25、str.replce()用str替换指定字符串从起始位置pos开始长度为len的字符串(当然也可以换成迭代器)s.replace(place,num,ss)
27、str.back()获取或修改字符串最后一个字符char b=str1.back();str.back()=‘1’;
28、str.front()获取或修改字符串的第一个字符char b=str1.front();str.front()=‘1
29、str.pop_back()删除字符串最后一个元素
30、reverse()反向输出,没有返回值reverse(s.begin(),s.end())
以下是对上述c++函数使用的梳理,有许多不足之处,代码的目的是熟悉使用,所以很多输入没有检查 若有兴趣读者可自行添加
#include<bits/stdc++.h>
using namespace std;
string s,s1;int choice,post,end;char s2; 
/*第一个字符串我通常都是命名为s1(模板字符串),有的需要插入或则什么操作 第一个都是命名为s1
post与end 就是区间左右  所有的字符命名都是s2,因为经常用到所以这里使用了全局的形式*/
string::iterator it;
*************************************功能函数******************************
void Inti(){//初始化的方式有 使用scanf,使用gets(),使用 getline(cin,str),或者cin 
	int choice;char ss[100];//使用scanf的时候是字符数组的形式 所以要先创建一个数组 
	printf("请选择你要使用的初始化方式\n"); 
	cout<<"1、使用scanf(不含有空白字符) 2、使用gets()  3、使用getline  4、使用cin(不能含有空白字符)"<<endl;
	scanf("%d",&choice);
	cout<<"请输入字符串"<<endl;
	switch(choice){
		case 1:{scanf("%s",ss);s=ss;break;}
		case 2:{getchar();gets(ss);s=ss;break;}
		case 3:{getchar();getline(cin,s);break;}
		case 4:{cin>>s;break;} 
		default:printf("你的输入有问题,请重新输入"); 
	}
	cout<<s<<endl;
}
void Add(){//尾部添加字符或者字符串 
/*添加的方式有+或者str.append(),若是添加字符str.push_back()*/ 
	printf("请你先输入一个字符串\n");
	getchar();
	getline(cin,s);
	cout<<"请问你要添加字符(选择1)还是字符串(选择2)"<<endl;
	int choice;char c;
	scanf("%d",&choice);/*getline得到换行符会被处理掉,但是scanf得到换行符并不会处理 
	依然留在缓冲区  使用需要一个getchar()来吸收,而cin 会跳过前面出现的特殊字符,所以不需要getchar()来吸收*/ 
	switch(choice){
		case 1:{printf("请输入一个字符串\n");getchar();getline(cin,s1);s+=s1;break;}
		case 2:{cout<<"请输入一个字符\n";cin>>c;s.push_back(c);} 
		default:{printf("你输入的有点问题");break;}
	}
	cout<<s<<endl; 
}
int Insert(){
/*插入的实现,根据返回值可以分成两种情况,字符串型与迭代器型*/ 
	cout<<"请选择使用字符串型(选择1)或迭代器型(选择2)";
	cin>>choice;
	cout<<"请输入原字符(被插入的字符)\n";
	cin>>s;
	cout<<"请输入要插入的位置\n";
	cin>>post;
	it=s.begin();
	if(post>=s.length()||post<0){printf("你的位置输入有问题\n");return 0;}
	switch(choice){
		case 1:{cout<<"请输入将要插入的字符串\n";cin>>s1;s.insert(post,s1);break;}
		case 2:{cout<<"请输入要插入的字符";cin>>s2;s.insert(it+post,s2);break;}
		}
	cout<<s<<endl;
}
//使用迭代器因为是使用的是char来接受 所以只能接受一个字符 
void Delete(){//使用erase() ,pop_back(),pop_front(),clear()
	cout<<"请你输入一个字符串"<<endl;
	cin>>s;
	cout<<"请问你要进行的操作是"<<endl;
	cout<<"1、全部删除	2、删除某一个位置、3、删除最后一个字符"<<endl;
	cin>>choice;
	switch(choice) {
		case 1:{s.clear();break;}
		case 2:{cout<<"请输入你要删除位值的区间"<<endl;cin>>post>>end;s.erase(s.begin()+post,s.begin()+end);break;}
		//case 3:{s.pop_back();break;}//不知道为什么我这里提示没有pop_back()
		default:{cout<<"你输入的有问题"<<endl;break;}
	}
	cout<<"现在的s是"<<s<<endl; 
}
void Change(){//front(),back(),replace(),
	cout<<"请输入你要修改的字符串"<<endl;
	cin>>s;
	cout<<"请问你要修改的是 1、第一个字符 2、中间某个区间	3、最后一个字符"<<endl;
	cin>>choice; 
	if(1==choice||3==choice) cout<<"请输入你现在要填入的字符"<<endl,cin>>s2;
	else cout<<"请输入你现在要填入字符串"<<endl,cin>>s1;
	switch(choice){
		//case 1:{s.front()=s2;break;} 不知道为什么提示我没有这个函数 
		case 1:{s.replace(s.begin(),s.begin()+1,&s2);break;}
		case 2:{cout<<"请输入你要填入的区间"<<endl;cin>>post>>end;s.replace(post,end,s1);break;} 
		//case 3:{s2=s.back();break;} 理由同上,欢迎同学指正问题所在 
		case 3:{s.replace(s.end()-1,s.end(),&s2);break;} 
	}
	cout<<"此时的s是"<<s<<endl; 
}
void Find(){//find(),rfind, find_first_of,find_last_of,  find_first_not_of
		cout<<"输入模板字符串"<<endl;
		cin>>s;
		cout<<"请输入要查找的字符(串)"<<endl;
		cin>>s1;
		cout<<"请问是用何种方式就行查找"<<endl;
		cout<<"1、从前向后找(第一次出现的位置) 2、从后向前找(最后一次出现的位置)"<<endl;
		cout<<"3、从前向后找(参数中任意字符出现的位置)"<<endl;
		cout<<"4、从后向前找(参数中任意字符出现的位置)" <<endl;
		cout<<"5、从指定位置开始找第一个不包含参数的字符串的位置 "<<endl;
		cout<<"6、从指定位置向前找第一个不包含参数的位置"<<endl; 
		cout<<"请选择你你要进行的操作";
		cin>>choice;
		switch(choice){
			case 1:{cout<<"s所在从前向后数的位置是"<<s.find(s1)<<endl;break;}
			case 2:{cout<<"s最后一次出现的位置的是"<<s.rfind(s1)<<endl;break;}
			case 3:{cout<<"s1中任意一个参选在s中出现的位置是"<<s.find_first_of(s1)<<endl;break;} 
			case 4:{cout<<"s1中任意一个参数在s中最后一次出现的位置是"<<s.find_last_of(s1)<<endl;break;}
			case 5:{cout<<"s中第一个不包含参数的字符串的位置是"<<s.find_first_not_of(s1)<<endl;break;}
			case 6:{cout<<"s中最后一个不包含参数的字符串的位置是"<<s.find_last_not_of(s1)<<endl;break;}
			default:{break;} 
		}//上面有缺陷就是没有加判断不存在的情况,加上感觉代码太长  感觉不舒服 读者可以自行加入 
} 
void Compare(){//compare ==
	cout<<"请输入你要比较的两个两个字符串";
	cin>>s>>s1;
	if(s==s1)cout<<s<<"和"<<s1<<"是相等的"<<endl;
	if(s.compare(s1)) cout<<s<<"和"<<s1<<"是不相等的"<<endl; 
}
void Sort(){//swap,reverse
	cout<<"1、交换两个字符串,2、交换一个字符串中字母的顺序"<<endl;
	cin>>choice; 
	switch(choice) {
		case 1:{cout<<"请输入两个字符串"<<endl;cin>>s>>s1;s.swap(s1);cout<<"交换之后的次序是"<<s<<"和"<<s1<<endl; break;}
		case 2:{cout<<"请输入一个字符串"<<endl;cin>>s;reverse(s.begin(),s.end());cout<<"字符串内部倒叙之后是"<<s<<endl;break;}
	}
}
void Judge(){//empty() 
	cout<<"请输入一个字符串";
	getchar();getline(cin,s); //这不用cin 原因是cin会跳过特殊字符,详情请看上一篇——输入输出 
	if(s.empty())cout<<"你没有输入任何字符串"<<endl; 
	else cout<<"你输入的字符串是"<<s<<endl; 
}
void Acquire(){// substr()
	cout<<"请输入你要截取的模板字符串"<<endl;
	cin>>s; 
	cout<<"请输入你要截取的区间"<<endl;
	cin>>post>>end;
	cout<<"截取之后的s是"<<s.substr(post,end)<<endl; 
} 
****************************操作函数****************************
menu(){
	cout<<"1.初始化        2.尾部追加字符(串)"<<endl;
  	cout<<"3.插入字符      4.删除"<<endl;
  	cout<<"5.替换字符(串)  6.搜索(包括六种搜索方式)"<<endl;
  	cout<<"7.比较          8.两字符交换或内部交换"<<endl;
  	cout<<"9.判空          10.获取字串"<<endl;
  	cout<<"11 退出"; 
}
int main(){
	while(1){
		menu();int choice; 
		printf("请输入你要进行的操作");
		cin>>choice;//输入要放在里面才能起到挂起的作用否则会一直循环 
		if(11==choice) break;
		switch(choice){
			case 1:Inti();break;
		    case 2:Add();break;
		    case 3:Insert();break;
		    case 4:Delete();break;
		    case 5:Change();break;
		    case 6:Find();break;
		    case 7:Compare();break;
		    case 8:Sort();break;
		    case 9:Judge();break;
		    case 10:Acquire();break;
		    default:cout<<"输入错误!"<<endl;break;
	
		
	}
	return 0; 
}

总结

若是文章对你的提升由哪怕一点帮助的话 请答应我 不要吝啬你的点赞评论 转载请告知哪一部分我检查一下

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值