目录
前面介绍了用字符数组来存储字符串。
char str[20] = "hello world";
今天我们来介绍另一个存储字符串的方式,保证你了解它之后,再也不想用那个难用的字符数组了。那就是string 类型。
1. string 概念
string是c++中的分装类型,不同与内置类型,所以在使用string和它包含的各个函数时要使用<string>这个头文件。
string s1;
string s2 = "abc";

注意string存储的字符串是没有'\0'的。
2. string 常⻅操作
2.1 创建字符串
#include<string>
int main()
{
string s1;
string s2 = "hello";
string s3("world");
string s4 = s2;
return 0;
}
s1和s2是常用的创建方法,s1是创建空字符串。
还可以像s4一样直接用s2赋值给s4。
string s1 = "haha";
string s2 = "hehe";
s2 = s1;
还可以对有值的字符串进行赋值。如果这是字符数组进行这种操作显然是不行的。
char arr1[10] ="hello";
char arr2[10] = "bit";
arr1 = arr2;
这里的arr1和arr2表示的是首元素地址,是常量,常量是不能进行赋值操作的。
2.2 string字符串的输⼊
2.2.1 cin的⽅式
可以直接用cin的方式对string进行输入字符串操作。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
//输⼊
cin >> s;
//输出
cout << s << endl;
return 0;
}
当我们输入不带空格的字符串时,能得到我们想要的答案
但一旦输入空格时,就会意外的截断。
如果我们想要解决这个问题,就要用到string里的函数getline了
2.2.2 getline 的⽅式
istream& getline (istream& is, string& str);
istream& getline (istream& is, string& str, char delim);
这是getline的原型,这里的istream是标准输入流,cin 是 istream 类型的标准输⼊流对象。
先来讲讲第一种吧!
getline(cin , string s);
先来讲讲这个的效果吧,从键盘上输入字符串并将其存储在s中,但它能存储空格。

第二种就不一样了,它可以指定结束的字符,当getline读取到那个字符时就是停止读取。是不是很神奇,让我们来实现一下吧。
2.3 size()
size()函数包含在string中,是个成员函数,所以在使用时要用 . 点运算符,size也如它的英文一样,可以用来计算string类型的变量的字符个数。
可以凭借这个性质来实现遍历字符串
#incldue <iostream>
#include <string>
using namespace std;
int main()
{
string s = "abcdef";
int i = 0;
for(i = 0; i < s.size(); i++)
{
cout << s[i] << " ";
}
return 0;
}
1
2.4 迭代器(iterator)
迭代器类似于指针,可以用来遍历容器(string)中的元素。
使用迭代器指向的元素时要使用(*)解引用操作符
2.4.1 begin() 和 end()
begin() :返回指向字符串第⼀个字符的迭代器,需要⼀个迭代器的变量来接收。
end() :返回指向字符串最后⼀个字符的下⼀个位置的迭代器(该位置不属于字符串)。
string 中 begin() 和 end() 返回的迭代器的类型是 string::iterator 。
可以这样遍历字符串

2.5 push_back()
可以用来在字符串的末尾加入一个字符。

2.6 字符串的+=和+运算
本来+=和+运算符只支持内置类型的,但string分装类型将+=和+等进行的运算符重载
就可以完美的替代刚刚讲的push_back类型了
比如

这里不仅能+=直接的字符串还能直接+=string类型的字符串
还是在字符串前面插入

是不是完美的替代了push_back,这个不好用的函数了。
2.7 pop_back()
这个函数用于删除字符串的最后一个字符。
但注意不要删除空字符串哦!

会出意外的哦!
2.8 insert
如果我们需要在字符串中间的某个位置插⼊⼀个字符串,怎么办呢?这时候我们得掌握⼀个函数就是
insert
函数原型如下:
string& insert (size_t pos, const string& str);
//pos
位置前⾯插⼊⼀个
string
字符串
string& insert (size_t pos, const char* s);
//pos
位置前⾯插⼊⼀个
C
⻛格的字符串
string& insert (size_t pos, size_t n, char c);
//pos
位置前⾯插⼊
n
个字符
c
这三种也没什么好讲的。看看就好了。
只需要注意pos是下标的位置就好了。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s = "abcdefghi";
string str = "xxx";
cout << s << endl;
s.insert(3, str);
cout << s << endl;
return 0;
}
2.9 find()
size_t find (const string& str, size_t pos = 0) const;
//
查找
string
类型的字符串
str
,默认是从头开始查找,
pos
可以指定位置开始
size_t find (const char* s, size_t pos = 0) const;
//
查找
C
⻛格的字符串
s
,默认是从头开始查找,
pos
可以指定位置开始
size_t find (const char* s, size_t pos, size_t n) const;
//
在字符串的
pos
这个位置开始查找
C
⻛格的字符串
s
中的前
n
个字符,
//这里是s的前几个哟
size_t find (char c, size_t pos = 0) const;
//
查找字符
c
,默认是从头开始,
pos
可以指定位置开始
注意返回的是size_t类型,如果未找到会返回size_t转换后的-1,就是个很大的数,string::npos。
2.10 substr()
substr() 函数⽤于截取字符串中指定位置指定⻓度的⼦串。函数原型如下:
string substr (size_t pos = 0, size_t len = npos) const;
//pos
的默认值是
0
,也就是从下标为
0
的位置开始截取
//len
的默认值是
npos
,意思是⼀直截取到字符串的末尾
substr() :如果函数不传参数,就是从下标为0的位置开始截取,直到结尾,得到的是整个字符串;
substr(pos) :从指定下标 pos 位置开始截取⼦串,直到结尾;
substr(pos, len) :从指定下标 pos 位置开始截取⻓度为 len 的⼦串。
注:本章很多内容抄录于比特蓝桥杯b站课程