c++ string用法 入门必看 超详细

1、string的作用

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

2、string常用的输入方法

(1)cin输入,遇到空格停止输入
代码示例:

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

输入:

hello world!

运行结果:

s1得到的值是: hello
s2得到的值是: world!

(2)getline输入,遇到换行符停止输入
代码示例:

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

输入:

hello world!
happy every day!

运行结果:

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

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

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

输入:

hi!
hello world!

运行结果:

s1得到的值是: hi!
s2是空串
s3得到的值是: hello world!

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

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

输入:

hi!
hello world!
happy every day!

运行结果:

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

3、string常用的成员函数

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

示例代码:

#include<iostream>//c++标准头文件,可以使用cout,cin等标准编译用法
using namespace std;//命名空间,防止重名给程序带来各种隐患,使用cin,cout,map,set,vector,queue时都要使用
int main(){
	string s="a";//定义一个字符串并初始化 
	
	cout<<"string常用的三种插入方法:"<<endl<<endl;
	cout<<"1、+号" <<endl;
	s+="b"; 
	cout<<"s+=\"b\"后:s="<<s<<endl<<endl; 
	
	cout<<"2、insert()"<<endl;
	s.insert(2,"c");
	cout<<"s.insert(2,\"c\")后:s="<<s<<endl<<endl; 
	
	cout<<"3、append"<<endl; 
	s.append("d");
	cout<<"s.append(\"d\")后:s="<<s<<endl<<endl; 
	
	cout<<"查看字符串大小"<<endl;
	cout<<"s.size()="<<s.size() <<endl<<endl;
	
	cout<<"截取字符串"<<endl; 
	cout<<"s.substr(1,2)="<<s.substr(1,2)<<endl<<endl;//下标1开始截取长度为2的字符串
	
	cout<<"删除特定字符"<<endl;
	s.erase(0,2);
	cout<<"s.erase(0,2)后: s="<<s<<endl<<endl;//从下标0开始删除两个字符<<endl; 
	
	cout<<"删除最后一个字符"<<endl;
	s.pop_back();
	cout<<"s.pop_back()后:s="<<s<<endl<<endl;
	 
	cout<<"两种判断字符串是否为空的方法"<<endl;
	cout<<"1、s.empty()等于1时即为空,等于0时非空"<<endl; 
	cout<<"2、用s==""判断,等于1时即为空,等于0时非空"<<endl; 
	cout<<"s.empty() = "<<s.empty()<<endl;
	cout<<"(s==\"\") = "<<(s=="")<<endl<<endl;
	
	cout<<"两种清空字符串方法"<<endl;
	cout<<"1、s.clear()"<<endl;
	cout<<"2、s=\"\""<<endl<<endl;
	s.clear();
	s=""; 
	
	cout<<"清空后"<<endl; 
	cout<<"s.empty() = "<<s.empty()<<endl;
	cout<<"(s==\"\") = "<<(s=="")<<endl<<endl;
} 

运行结果

string常用的三种插入方法:

1+号
s+="b"后:s=ab

2insert()
s.insert(2,"c")后:s=abc

3、append
s.append("d")后:s=abcd

查看字符串大小
s.size()=4

截取字符串
s.substr(1,2)=bc

删除特定字符
s.erase(0,2): s=cd

删除最后一个字符
s.pop_back()后:s=c

两种判断字符串是否为空的方法
1、s.empty()等于1时即为空,等于0时非空
2、用s==判断,等于1时即为空,等于0时非空
s.empty() = 0
(s=="") = 0

两种清空字符串方法
1、s.clear()
2、s=""

清空后
s.empty() = 1
(s=="") = 1

4、string的大小比较

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

#include<iostream>//c++标准头文件,可以使用cout,cin等标准编译用法
using namespace std;//命名空间,防止重名给程序带来各种隐患,使用cin,cout,map,set,vector,queue时都要使用
int main(){
	string s1="abc";
	string s2="acb";
//	先比较a和a,相等时再比较b和c,明显b<c,所以 abc<acb
	if(s1>s2){
		cout<<s1<<">"<<s2<<endl;
	}else if(s1==s2){
		cout<<s1<<"="<<s2<<endl;
	}else{
		cout<<s1<<"<"<<s2<<endl;
	}
	
	s1="bbc";
	s2="bb";
	if(s1>s2){
		cout<<s1<<">"<<s2<<endl;
	}else if(s1==s2){
		cout<<s1<<"="<<s2<<endl;
	}else{
		cout<<s1<<"<"<<s2<<endl;
	}
	
	s1="bbc";
	s2="bbbc";
	if(s1>s2){
		cout<<s1<<">"<<s2<<endl;
	}else if(s1==s2){
		cout<<s1<<"="<<s2<<endl;
	}else{
		cout<<s1<<"<"<<s2<<endl;
	}
	
} 

运行结果:

abc<acb
bbc>bb
bbc>bbbc

5、string的遍历方法
(1)下标遍历:通过下标随机访问逐个遍历。
示例代码:

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

运行结果:

abcdefg

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

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

运行结果:

gfedcba

(2)foreach遍历
示例代码:

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

运行结果:

abcdefg

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

5、string与数字的相互转换

(1)to_string()函数

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

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

#include<iostream>
using namespace std;
int main(){
	string s;
	int a=111111;
	long long b=222222;
	char c='a';
	s=to_string(a);
	cout<<s<<endl;
	s=to_string(b);
	cout<<s<<endl;
//	将转换成ASCII值97 
	s=to_string(c);
	cout<<s<<endl;
} 
//console:
//111111
//222222
//97
//

(2)stoi()函数

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

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

#include<iostream>
using namespace std;
int main(){
	string s;
	s="100b345";
	cout<<stoi(s)<<endl;
	s="-100-345";
	cout<<stoi(s)<<endl;	
} 
//console:
//100
//-100
//

(3)atoi()函数

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

#include<iostream>
using namespace std;
int main(){
	const char *s;
	s="100b345";
	cout<<atoi(s)<<endl;
	s="-100-345";
	cout<<atoi(s)<<endl;	
} 
//console:
//100
//-100
//

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

stol()//将字符串转为 long 类型
stoll()//将字符串转为 long long 类型
stof()//将字符串转为 float 类型
stod()//将字符串转为 double 类型
stold()//将字符串转为 long double 类型

是不是很简单呢?

刚接触肯定会觉得难,多些做题多些用,熟悉了就容易了,兄弟萌,加油!!!

文章尚有不足,欢迎大牛们指正

感谢观看,点个赞吧

  • 61
    点赞
  • 224
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
C++标准函数库中80%是STL,其中广泛使用了泛性编程思想,在其中分为几大部分。 1:语言支持部分。 2:诊断部分。包含了异常处理,断言,错误代码三大方式。 3:通用工具部分。包括动态内存管理工具,日期/时间处理工具等。 4:字符串处理部分。 5:国际化部分。使用Locale和facet可以为程序提供多国际化支持,包括各种字符集,日期时间,数值货币处理的支持。 6:容器(containers)部分。STL重要部分,包含了许多数据结构,有vector(动态增加的数组),queue(队列),stack(堆栈)……甚至也包括string,它也可以看做为一种容器,并且适用所有的容器可用的方法。 7:算法(algorithms)部分。STL重要部分,包含了70多个通用算法,都是优化的效率很高的,用来控制各种容器,内建数组等。例如find可以用来在容器中查找某特定值的元素,for_each可以用来将函数应用到容器元素之上,sort用于对容器中的元素排序。 8;迭代器(iterators)STL重要组成部分,每个容器都有自己的迭代器,只有容器才可以进行访问自己的元素,它类似指针,将算法和容器中的元素联系起来。 9:数值(numerics)部分。包含了一些数学运算的功能库,对复数运算提供了支持。 10:输入输出(I/O)部分。摸版化的IOStream部分。他提供了对C++程序的支持,并且对原有的iostream兼容。 所以,总体看来,C++标准函数库,包含的10大块内容中,STL主要包含了四个部分,迭代器,容器,算法。和额外的一个字符串。
string的find函数是用来查找一个子串在一个字符串中的位置的。它可以返回子串在字符串中第一次出现的位置,如果没有找到则返回string::npos。\[1\]可以通过指定两个参数来使用find函数,第一个参数是要查找的子串,第二个参数是从哪个位置开始查找。如果只指定一个参数,则默认从字符串的开头开始查找。\[3\]可以通过循环来查找子串在字符串中所有出现的位置,每次找到一个位置后,将position加1,继续查找下一个位置,直到找不到为止。\[2\] #### 引用[.reference_title] - *1* [c++string中find用法(快速入门)](https://blog.csdn.net/qq_62946103/article/details/127868375)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [string的find( )函数✅](https://blog.csdn.net/weixin_45884316/article/details/108235945)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [string类型数据的find函数](https://blog.csdn.net/OpenStack_/article/details/88429962)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旧林墨烟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值