C++ 部分函数
string库
1、size()与length()
字符串长,结果相同
string s;
s.length(); //s.length()-1是最后一个字符的下标,而不是'\0'
for(i=0;i<s.length()-1;i++) cout<<s[i]<<endl; //可以输出每个字符
s.size();
2、find(char ch)
用于string类型
在字符串中找字符ch,没找到返回-1,找到则返回下标;也可以查找一个子串,返回子串(首字符)的下标
string s; if(s.find('a')==-1) return false;
没在s中找到字符'a'的话,返回false。
从指定位置处查找
string s; cin>>s; if(s.find('a',5)!=-1)//从下标为5处(包含s[5])开始查找 return true;
如果s中有多个相同字符,而要分别输出它们的位置
string s; cin>>s; int pos=0;//记录位置 while((pos=s.find('a',pos))!=-1) cout<<"position"<<pos++<<";";//每次要从上一个位置之后开始查找,不然就会一直输出之前的位置,所以pos++表明从之后开始查找
参考:https://www.cnblogs.com/wkfvawl/p/9429128.html
3、统计字符串长度
strlen(ch):不包含末尾的0;
另外也可用递归的方式不用strlen统计字符串长度
//用递归求字符串长度,字符串都以'\0'结尾 int strlen1(char * ch){ if(*ch!='\0')return strlen1(ch+1)+1; else return 0
4、提取子串
string s="abcdef"
cout<<s.substr(pos,len)
从指定位置(下标)pos开始,长度为len的子串;
如果没有len或者len长度超过了字符串长,会一直延续到结尾;
如果pos和len都没有,则默认复制整串
PS:第二个参数是子串长度,而不是结束位置!
5、字符串比大小
strcmp(str1,str2)
str1与str2必须是char *或者char []而不能是string类型
根据每个字符的ASC码依次比较str1与str2中的每个字符,直到第一个不相同的字符或者其中一个字符串到尾'\0'
<0 str1小于str2
=0 相等
>0 str1大于str2
string类型的字符串比大小,用string的成员函数compare()
string s1,s2;
s1.compare(s2);
<0 s1<s2
=0 s1=s2
>0 s1>s2
6、字符串复制
strcpy(a,b) 将b复制到a中
algorithm库
7、sort排序,可以按照先后条件进行排序
sort(start,end,cmp)
start为开始的地址,如果不是指针类型的要用引用符号'&'得到地址
end为最后一个地址,即如果是A[8]数组,end应该是A[8]而不是A[7],所以此处的end是终结地址
cmp为排序方式,默认升序
经常自己定义第三个参数即cmp函数,以达到需要的目的,cmp函数返回一个布尔值,其中必须包含逻辑表达式(即比大小的方式)
举个例子:
class Student { public: char name[100]; int age; float grade; }; bool cmp(Student S1, Student S2) { //小于号 表示用从小到大的方式排序 if (S1.grade != S2.grade) return S1.grade<S2.grade; else if (strcmp(S1.name, S2.name) != 0) return strcmp(S1.name, S2.name)<0; else return S1.age<S2.age; } int main() { int i = 0; //输入N个Student对象的值 int N; cin >> N; Student *S = new Student[N]; for (i = 0; i<N; i++) cin >> S[i].name >> S[i].age >> S[i].grade;
sort(&S[0], &S[N], cmp); for (i = 0; i<N; i++) cout << S[i].name << ' ' << S[i].age << ' ' << S[i].grade << endl; delete[] S; }
上述函数就是分别按照grade,name,age的大小关系进行排序,当grade相同时,按name的ascii码大小排序,name也想通就按照年龄从小到大排序
参考:https://www.cnblogs.com/epep/p/10959627.html
8、erase函数,用于一个string或者迭代器类型(iterator)的对象
用法:3种
erase(int pos,n):抹去pos位置(int类型)处n个元素
erase(iterator pos):抹去pos位置(迭代器类型)处一个元素
erase(iterator start,iterator end):抹去从start到end处的元素,这里的start与end都以迭代器的形式表现
由于string类型也是一种容器,可以构建迭代器,所以这里统一用string来举例
#include<string> #include<iostream> #include<Windows.h> using namespace std; int main() { string S("This is an example"); string::iterator it; S.erase(9, 1); cout << S << endl; //输出 This is a example it = S.begin(); S.erase(it + 10); cout << S << endl; //输出 This is a xample S.erase(it, it + 4); cout << S << endl; //is a xample system("pause"); return 0; }
erase与find函数配合,可以达到删除一个字符串中特定字符的目的:https://www.cnblogs.com/LesBlog/p/12569652.html
参考:https://blog.csdn.net/weixin_41969587/article/details/82587372
9、字符串颠倒
三种方法:
1、
cin>>s; int i=0; string res(""); for(i=s.length()-1;i>=0;i--) res+=s[i]; cout<<res<<endl;
2、strrev()函数
string库,用于char[]数组
int main(){ char c[]="abcde"; strrev(c); cout<<c<<endl; return 0; } //结果 edcba
3、algorithm库的reverse()函数,用于string类型
reverse()函数不只可以用于字符串颠倒,还可以用于vector容器类型的颠倒
int main(){ string S("abcdef"); reverse(S.begin(),S.end()); cout<<S<<endl; //结果 fedcba }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性