C++中的string用法简介

本文详细介绍了C++标准库中的string对象的各种操作,包括赋值、输入、求长度、字符串连接、遍历、删除子串、插入子字符串、替换子字符串、提取子字符串、查找字符串等常见功能,通过实例展示了每个操作的使用方法和注意事项。
摘要由CSDN通过智能技术生成

string是C++标准库的一个重要的部分,主要用于字符串处理,这里对常用成员函数按功能进行分类。

1. 赋值

可以用字符串常量,string变量,以及 char 类型的变量、常量对 string 对象进行赋值;

string s1, s2, s3;
s1 = "Hello";  // s1 = "Hello"
s2 = 'K';  // s2 = "K”
s3 = s1;  // s3 = "Hello"

2. 输入

cin>> 可以实现将以空格或回车(任何空白字符)为 “结束符” 的字符序列读入到对应的字符串中,并且开头和结尾的空白字符不包括进字符串中。

string s1;
cin>>s1; // 控制台输入" hello world"按回车后,s1 = "hello" 

如果想要将空格输入到字符串中,需要使用getline() 函数。
该函数可将整行的所有字符读到字符串中。在读取字符时,遇到文件结束符、分界符、回车符时,将终止读入操作,且文件结束符、分界符、回车符在字符串中不会保存;
当已读入的字符数目超过字符串所能容纳的最大字符数时,将会终止读入操作。

string s1, s2;
getline(cin, s1);  // 等价于 getline(cin, s1, '\n')
getline(cin, s2, ' '); // 可以接受第三个可选字符参数,指定分界符
cout << "You inputed chars are: " << s1 << endl;
cout << "You inputed chars are: " << s2 << endl;

执行结果:

hello world
hello world
You inputed chars are: hello world
You inputed chars are: hello

3. 求长度

c++中的string类型求长度有两种方法 str.length() 以及 str.size()

string str;
cin >> str; // 输入 "abcdefg"
int len1 = str.size();  // len1=7
int len2 = str.length();  // len2=7

4. 字符串连接

对于string类型变量,我们可以直接用“+”或者“+=”进行字符串的连接,操作符非常方便。
用“+”风格字符串进行字符串连接时,操作符左右两边既可以都是string字符串,也可以是一个string字符串和一个C风格的字符串(char数组),还可以是一个string字符串和一个char字符。
而用“+=”风格字符串进行字符串连接时,操作符右边既可以是一个string字符串,也可以是一个C风格字符串或一个char字符。

string s1, s2, s3;
s1 = "first";
s2 = "second";
s3 = s1 + s2;  // s3="firstsecond"
cout<< s3 <<endl;
s2 += s1;  // s2="secondfirst"
cout<< s2 <<endl;
s1 += "third";  // s1="firstthird"
cout<< s1 <<endl;
s1 += 'a';  //s1="firstthirda"
cout<< s1 <<endl;

5. 遍历

string字符串同样可以先字符串数组那样按照下标逐一访问字符串中的每一个字符,string字符串的起始下标仍是从0开始。

string s1 ;
s1 ="1234567890";
for(int i=0; i<s1.length(); i++){
	cout<<s1[i]<<" ";	
}
cout<<endl;
s1[5] = '5';  // s1="1234557890"
cout<<s1<<endl;

6. 删除子串

erase函数可以删除string类型变量中的一个子字符串。erase函数有两个参数,第一个参数是要删除的子字符串的起始下标,第二参数是要删除子字符串的长度,如果第二个参数不指名的话则是直接从第一个参数获取起始下标,然后一直删除至字符串结束。

string s1, s2, s3;
s1 = s2 = s3 = "1234567890";
s2.erase(5);  // s2="12345"
s3.erase(5, 3);  // s3="1234590"

在使用erase函数时,在第一个参数没有越界的条件下,第二个参数可能会导致需要删除的子字符串越界,但实际上是不会的,函数会从以下两个值中取出一个最小值作为待删除子字符串的长度:

  • 第二个参数的实参值;
  • 字符串长度减去第一个参数的实参值。

7. 插入子字符串

函数insert可以在string字符串中指定的位置插入另一个字符串,该函数同样有两个参数,第一个参数表示插入位置,第二参数表示要插入的字符串,第二个参数既可以是string变量,又可以是C风格的字符串。

string s1, s2, s3;
s1 = s2 = "1234567890";
s3 = "aaa";
s1.insert(5, s3);  // s1="12345aaa67890"
s2.insert(5, "aaa");  // s2="12345aaa67890"

8. 替换子字符串

replace函数可以用一个指定的字符串来替换string类型变量中的一个子字符串,该函数有三个参数,第一个参数表示待替换的子字符串的其实下标,第二个参数表示待替换子字符串的长度,第三个参数表示要替换子字符串的字符串。第三个参数同样可以是string类型变量或C风格字符串。

string s1, s2, s3;
s1 = s2 = "1234567890";
s3 = "aaa";
s1.replace(5, 4, s3);  // s1="12345aaa0"
s2.replace(5, 4, "aaa");  // s2="12345aaa0"

如果第一个参数越界则会抛出异常。在第一个参数没有越界的前提下,第二个参数如果导致越界,则会选择以下两个值中的最小值作为待替换子字符串的长度:

  • 第二个参数的实参值;
  • 字符串长度减去第一个参数的实参值。

9. 提取子字符串

函数substr可以提取string字符串中的子字符串,该函数有两个参数,第一个参数为需要提取的子字符串的起始下标,第二个参数是需要提取的子字符串的长度。

string s1 = "first second third";
string s2;
s2 = s1.substr(6, 6);  // s2="second"

如果第一个参数越界则函数会抛出异常。在第一个参数没有越界的情况下,第二个参数仍然会导致越界,该函数的处理方式与前面提到的erase函数、replace函数相同,子字符串最多从第一个参数所指明的下标开始一直延续到字符串结尾。

10. 查找字符串

find函数可以在字符串中查找子字符串中出现的位置。该函数有两个参数,第一个参数是待查找的子字符串,第二个参数是表示开始查找的位置,如果第二个参数不指名的话则默认从0开始查找,也即从字符串首开始查找。

string s1 = "first second third";
string s2 = "second";
int index = s1.find(s2,5);  // index=6
if(index < s1.length()){
	cout<<"Found at index : "<< index <<endl;
}else{
	cout<<"Not found"<<endl;
}

函数最终返回的是子字符串出现在字符串中的起始下标。例1程序最终实在下标6处找到了s2字符串。如果没有查找到子字符串,则会返回一个无穷大值4294967295(npos)。

rfind函数与find函数很类似,同样是在字符串中查找子字符串,不同的是find函数是从第二个参数开始往后查找,而rfind函数则是最多查找到第二个参数处,如果到了第二个参数所指定的下标还没有找到子字符串,则返回一个无穷大值npos

string s1 = "first second third";
string s2 ="second";
int index = s1.rfind(s2,6);
if(index < s1.length()){
	cout<<"Found at index : "<< index <<endl;
}else{
	cout<<"Not found"<<endl;
}

rfind函数第二个参数是6,也就是说起始查找从0到6,如果找到了则返回下标,否则返回一个无穷大。本例中刚好在下标6的时候找到了子字符串s2,故而返回下标6。

find_first_of函数是用于查找子字符串和字符串共同具有的字符在字符串中出现的位置。

string s1 = "first second second third";
string s2 = "asecond";
int index = s1.find_first_of(s2);
if(index < s1.length()){
	cout<<"Found at index : "<< index <<endl;
}else{
	cout<<"Not found"<<endl;
}
      

本例中s1和s2共同具有的字符是’s’,该字符在s1中首次出现的下标是3,故查找结果返回3。
而find_first_not_of函数则相反,它查找的是在s1字符串但不在s2字符串中的首位字符的下标,如果查找不成功则返回无穷大。

string s1 = "secondasecondthird";
string s2 = "asecond";
int index = s1.find_first_not_of(s2);
if(index < s1.length()){
	cout<<"Found at index : "<< index <<endl;
}else{
	cout<<"Not found"<<endl;
}

在本例中在s1但是不在s2中的首字符是’t’,其所在下标为13,故而返回下标13。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值