君子进德修业,欲及时也
函数 | 功能 | 实现原理 |
---|---|---|
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 | 这个有好几种方式(后面文章会介绍),目前你可以使用最简单的一种也就是暴力解法,使用双指针,逐个对比 |
函数 | 功能 | 实例 |
---|---|---|
1、str.begin() | 返回首地址的迭代器 | str.begin() |
2、string(const char *s) | 将string对象初始化为s指向的字符串 | string str(“hello”); |
3、string(size_type n,char c) | 创建一个包含n个元素的string对象 每个元素都被初始化c | string str(10,‘a’); |
4、string(const string&str) | 将一个string对象初始化为string对象 str | string str(“abc”);string str2(str); |
5、string(): | 创建一个默认的string对象,默认长度是0 | string 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
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;
}
若是文章对你的提升由哪怕一点帮助的话 请答应我 不要吝啬你的点赞评论 转载请告知哪一部分我检查一下