当前位置:   article > 正文

【C/C++干货系列】string字符串用法

【C/C++干货系列】string字符串用法

目录

1、string的作用

2、string常用的输入方法

(1)cin输入,遇到空格停止输入

(2)getline输入,遇到换行符停止输入

 (3)string常用的成员函数

(4) string的大小比较

(5) string的遍历方法

下标遍历:通过下标随机访问逐个遍历。

foreach遍历

(6)string与数字的相互转换

to_string()函数

stoi()函数

atoi()函数


1、string的作用

string就是字符串的意思,是c++用来代替char数组的数据结构。里面封装了一些常用的方法,方便我们地对其进行一些操作,而且string的空间大小是动态变化的,大大减小了不必要的花销

2、string常用的输入方法

(1)cin输入,遇到空格停止输入

代码示例:

  1. #include<iostream>//c++标准头文件,可以使用cout,cin等标准编译用法
  2. using namespace std;//命名空间,防止重名给程序带来各种隐患,使用cin,cout,map,set,vector,queue时都要使用
  3. int main(){
  4.     string s1,s2;//定义字符串s1、s2 
  5.     cin>>s1;//输入一个字符串给s1 
  6.     cin>>s2;//输入一个字符串给s2 
  7.     cout<<"s1得到的值是: "<<s1<<endl;
  8.     cout<<"s2得到的值是: "<<s2<<endl;



输入:

hello world!



运行结果:

  1. s1得到的值是: hello
  2. s2得到的值是: world!



(2)getline输入,遇到换行符停止输入

代码示例:

  1. #include<iostream>//c++标准头文件,可以使用cout,cin等标准编译用法
  2. using namespace std;//命名空间,防止重名给程序带来各种隐患,使用cin,cout,map,set,vector,queue时都要使用
  3. int main(){
  4.     string s1,s2;//定义字符串s1、s2
  5.     getline(cin,s1);//输入一行字符串给s1 
  6.     getline(cin,s2);//输入一行字符串给s2 
  7.     cout<<"s1得到的值是: "<<s1<<endl;
  8.     cout<<"s2得到的值是: "<<s2<<endl;



输入:

  1. hello world!
  2. happy every day!



运行结果:

  1. s1得到的值是: hello world!
  2. s2得到的值是: happy every day!



值得注意的是:
cin输入会自动吃点前置换行和空格,即cin输入得到的不可能是空串。而getline不会吃掉换行符号,可能会使得输入出现意料之外的错误。
示例代码:

  1. #include<iostream>//c++标准头文件,可以使用cout,cin等标准编译用法
  2. using namespace std;//命名空间,防止重名给程序带来各种隐患,使用cin,cout,map,set,vector,queue时都要使用
  3. int main(){
  4.     string s1,s2,s3;//定义字符串s1、s2、s3
  5.     cin>>s1; //输入一个字符串给s1 
  6.     getline(cin,s2);//输入一行字符串给s2 
  7.     getline(cin,s3);//输入一行字符串给s3 
  8.     cout<<"s1得到的值是: "<<s1<<endl;
  9. //    判断s2是不是空串 
  10.     if(s2==""){
  11.         cout<<"s2是空串" <<endl; 
  12.     } else{
  13.         cout<<"s2得到的值是: "<<s2<<endl;
  14.     }
  15.     cout<<"s3得到的值是: "<<s3<<endl;



输入:

  1. hi!
  2. hello world!



运行结果:

  1. s1得到的值是: hi!
  2. s2是空串
  3. s3得到的值是: hello world!



解决的办法是多写一个getline,或者getchar()来达到吃掉多余的换行符字符:
示例代码:

  1. #include<iostream>//c++标准头文件,可以使用cout,cin等标准编译用法
  2. using namespace std;//命名空间,防止重名给程序带来各种隐患,使用cin,cout,map,set,vector,queue时都要使用
  3. int main(){
  4.     string s1,s2,s3;//定义字符串s1、s2、s3
  5.     cin>>s1; //输入一个字符串给s1 
  6.     getchar();//吃掉多余的换行符 
  7.     getline(cin,s2);//输入一行字符串给s2 
  8.     getline(cin,s3);//输入一行字符串给s3 
  9.     cout<<"s1得到的值是: "<<s1<<endl;
  10. //    判断s2是不是空串 
  11.     if(s2==""){
  12.         cout<<"s2是空串" <<endl; 
  13.     } else{
  14.         cout<<"s2得到的值是: "<<s2<<endl;
  15.     }
  16.     cout<<"s3得到的值是: "<<s3<<endl;


输入:

  1. hi!
  2. hello world!
  3. happy every day!



运行结果:

  1. s1得到的值是: hi!
  2. s2得到的值是: hello world!
  3. s3得到的值是: happy every day!



 (3)string常用的成员函数

  1. size()//获取字符串长度
  2. insert()//插入字符串
  3. append()//插入字符串
  4. erase()//删除任意字符,时间复杂度O(n),n为字符串长度
  5. substr()//截取字符字串
  6. back()//获取最后一个字符
  7. pop_back()//删除最后一个字符,时间复杂度O(1)
  8. empty()//判断是否为空
  9. clear()//清空字符串



示例代码:

  1. #include<iostream>//c++标准头文件,可以使用cout,cin等标准编译用法
  2. using namespace std;//命名空间,防止重名给程序带来各种隐患,使用cin,cout,map,set,vector,queue时都要使用
  3. int main(){
  4.     string s="a";//定义一个字符串并初始化 
  5.     
  6.     cout<<"string常用的三种插入方法:"<<endl<<endl;
  7.     cout<<"1、+号" <<endl;
  8.     s+="b"
  9.     cout<<"s+=\"b\"后:s="<<s<<endl<<endl; 
  10.     
  11.     cout<<"2、insert()"<<endl;
  12.     s.insert(2,"c");
  13.     cout<<"s.insert(2,\"c\")后:s="<<s<<endl<<endl; 
  14.     
  15.     cout<<"3、append"<<endl; 
  16.     s.append("d");
  17.     cout<<"s.append(\"d\")后:s="<<s<<endl<<endl; 
  18.     
  19.     cout<<"查看字符串大小"<<endl;
  20.     cout<<"s.size()="<<s.size() <<endl<<endl;
  21.     
  22.     cout<<"截取字符串"<<endl; 
  23.     cout<<"s.substr(1,2)="<<s.substr(1,2)<<endl<<endl;//下标1开始截取长度为2的字符串
  24.     
  25.     cout<<"删除特定字符"<<endl;
  26.     s.erase(0,2);
  27.     cout<<"s.erase(0,2)后: s="<<s<<endl<<endl;//从下标0开始删除两个字符<<endl; 
  28.     
  29.     cout<<"删除最后一个字符"<<endl;
  30.     s.pop_back();
  31.     cout<<"s.pop_back()后:s="<<s<<endl<<endl;
  32.      
  33.     cout<<"两种判断字符串是否为空的方法"<<endl;
  34.     cout<<"1、s.empty()等于1时即为空,等于0时非空"<<endl; 
  35.     cout<<"2、用s==""判断,等于1时即为空,等于0时非空"<<endl; 
  36.     cout<<"s.empty() = "<<s.empty()<<endl;
  37.     cout<<"(s==\"\") = "<<(s=="")<<endl<<endl;
  38.     
  39.     cout<<"两种清空字符串方法"<<endl;
  40.     cout<<"1、s.clear()"<<endl;
  41.     cout<<"2、s=\"\""<<endl<<endl;
  42.     s.clear();
  43.     s=""
  44.     
  45.     cout<<"清空后"<<endl; 
  46.     cout<<"s.empty() = "<<s.empty()<<endl;
  47.     cout<<"(s==\"\") = "<<(s=="")<<endl<<endl;



 

  1. string常用的三种插入方法:
  2. 1、+号
  3. s+="b"后:s=ab
  4. 2insert()
  5. s.insert(2,"c")后:s=abc
  6. 3、append
  7. s.append("d")后:s=abcd
  8. 查看字符串大小
  9. s.size()=4
  10. 截取字符串
  11. s.substr(1,2)=bc
  12. 删除特定字符
  13. s.erase(0,2)后: s=cd
  14. 删除最后一个字符
  15. s.pop_back()后:s=c
  16. 两种判断字符串是否为空的方法
  17. 1、s.empty()等于1时即为空,等于0时非空
  18. 2、用s==判断,等于1时即为空,等于0时非空
  19. s.empty() = 0
  20. (s=="") = 0
  21. 两种清空字符串方法
  22. 1、s.clear()
  23. 2、s=""
  24. 清空后
  25. s.empty() = 1
  26. (s=="") = 1



(4) string的大小比较

string的比较是以逐个字母的ascii码进行比较的
示例代码:

  1. #include<iostream>//c++标准头文件,可以使用cout,cin等标准编译用法
  2. using namespace std;//命名空间,防止重名给程序带来各种隐患,使用cin,cout,map,set,vector,queue时都要使用
  3. int main(){
  4.     string s1="abc";
  5.     string s2="acb";
  6. //    先比较a和a,相等时再比较b和c,明显b<c,所以 abc<acb
  7.     if(s1>s2){
  8.         cout<<s1<<">"<<s2<<endl;
  9.     }else if(s1==s2){
  10.         cout<<s1<<"="<<s2<<endl;
  11.     }else{
  12.         cout<<s1<<"<"<<s2<<endl;
  13.     }
  14.     
  15.     s1="bbc";
  16.     s2="bb";
  17.     if(s1>s2){
  18.         cout<<s1<<">"<<s2<<endl;
  19.     }else if(s1==s2){
  20.         cout<<s1<<"="<<s2<<endl;
  21.     }else{
  22.         cout<<s1<<"<"<<s2<<endl;
  23.     }
  24.     
  25.     s1="bbc";
  26.     s2="bbbc";
  27.     if(s1>s2){
  28.         cout<<s1<<">"<<s2<<endl;
  29.     }else if(s1==s2){
  30.         cout<<s1<<"="<<s2<<endl;
  31.     }else{
  32.         cout<<s1<<"<"<<s2<<endl;
  33.     }
  34.     



运行结果:

  1. abc<acb
  2. bbc>bb
  3. bbc>bbbc



(5) string的遍历方法

下标遍历:通过下标随机访问逐个遍历。

示例代码:

  1. #include<iostream>//c++标准头文件,可以使用cout,cin等标准编译用法
  2. using namespace std;//命名空间,防止重名给程序带来各种隐患,使用cin,cout,map,set,vector,queue时都要使用
  3. int main(){
  4.     string s="abcdefg";
  5.     for(int i=0;i<s.size();i++){
  6.         cout<<s[i];
  7.     }



运行结果:

abcdefg



如果想逆序遍历呢?只需要逆向思考,从s.size()-1到0遍历即可

示例代码:

  1. #include<iostream>//c++标准头文件,可以使用cout,cin等标准编译用法
  2. using namespace std;//命名空间,防止重名给程序带来各种隐患,使用cin,cout,map,set,vector,queue时都要使用
  3. int main(){
  4.     string s="abcdefg";
  5.     for(int i=s.size()-1;i>=0;i--){
  6.         cout<<s[i];
  7.     }



运行结果:

gfedcba



foreach遍历

示例代码:

  1. #include<iostream>//c++标准头文件,可以使用cout,cin等标准编译用法
  2. using namespace std;//命名空间,防止重名给程序带来各种隐患,使用cin,cout,map,set,vector,queue时都要使用
  3. int main(){
  4.     string s="abcdefg";
  5.     for(char c:s){
  6.         cout<<c;
  7.     }



运行结果:

abcdefg



foreach遍历方法在结构体的遍历中比较常用,因为其简单易写,但是有一个弊端就是不能逆序遍历。

(6)string与数字的相互转换

to_string()函数

作用: 将基本类型的值转换为字符串

基本类型包括int、long long、char等等
使用的时候注意超限问题就好了,特殊地,char类型的转换是转换成它的ASCII值,而不是字符

  1. #include<iostream>
  2. using namespace std;
  3. int main(){
  4.     string s;
  5.     int a=111111;
  6.     long long b=222222;
  7.     char c='a';
  8.     s=to_string(a);
  9.     cout<<s<<endl;
  10.     s=to_string(b);
  11.     cout<<s<<endl;
  12. //    将转换成ASCII值97 
  13.     s=to_string(c);
  14.     cout<<s<<endl;
  15. //console:
  16. //111111
  17. //222222
  18. //97
  19. //



stoi()函数

作用: 将字符串转换为 int 型

使用的时候千万注意细节,不然很容易出现异常的,字符串转回整型别超出整型范围了,还有说一下转换规则:
1、识别的时候左到右,遇到非法符自动停止,非法符号即非数字和前置正负号,如100b345,转换为100,-100-345转换为-100,超出整型会抛出异常

  1. #include<iostream>
  2. using namespace std;
  3. int main(){
  4.     string s;
  5.     s="100b345";
  6.     cout<<stoi(s)<<endl;
  7.     s="-100-345";
  8.     cout<<stoi(s)<<endl;    
  9. //console:
  10. //100
  11. //-100
  12. //



atoi()函数

作用: 和stoi()作用一样,区别是stoi()处理的是string类型,atoi()处理的是const char*类型,而且超过整型范围不会抛出异常

  1. #include<iostream>
  2. using namespace std;
  3. int main(){
  4.     const char *s;
  5.     s="100b345";
  6.     cout<<atoi(s)<<endl;
  7.     s="-100-345";
  8.     cout<<atoi(s)<<endl;    
  9. //console:
  10. //100
  11. //-100
  12. //



(4)其它一些类似的函数

  1. stol()//将字符串转为 long 类型
  2. stoll()//将字符串转为 long long 类型
  3. stof()//将字符串转为 float 类型
  4. stod()//将字符串转为 double 类型
  5. stold()//将字符串转为 long double 类型



是不是很简单呢?

感谢观看,点个赞吧

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/840359
推荐阅读
相关标签
  

闽ICP备14008679号