0%
boxmoe_header_banner_img

加载中

String基本知识


avatar
mizuki 2026年6月8日 2026年6月8日 8

引言

从本文开始,我们将对 C++ 容器进行系统讲解,首先,从相对简单的string说起。

1.基础知识

  • 1.1 概念

string本质是一个字符顺序表

  • 1.2 包含头文件
<string>

2.构造

  • 2.1 无参构造(默认)

不提供任何数据,由编译器执行的默认构造,只包含了“/0”这个字符,如下:

string s1;
  • 2.2 参数构造

提供字符串变量,或者直接提供字符串都可以进行构造,如下:

string s2("mzk likes ena");

cout << s2 << endl;
  • 2.3 拷贝构造

直接拷贝另一个string变量,用括号和=都可以实现

tring s2("mzk likes ena");
string s3(s2);
string s4 = s2;

cout << s3 << endl;
cout << s4 << endl;
  • 2.4 选择拷贝构造

可以选择拷贝对象中的一部分进行拷贝,第一个参数表示的是从哪个下标开始,第二个参数表示的是往后几个字符,如下:

string s2("mzk likes ena");

string s5(s2, 0, 3);
cout << s5 << endl;

运行结果如下:

如果不写第三个参数,那么就会从指定的下标开始直接拷贝完,如下:

string s2("mzk likes ena");

string s5(s2, 4);
cout << s5 << endl;

运行结果如下:

  • 2.5 用连续的n个字符去初始化

没什么好解释的,直接给例子

string s6(10, 'm');
cout << s6 << endl;

3.基本用法

  • 3.1 string::operator[]

本质就是像数组一样通过下标去修改数据,如果越界就会报错

string s1("mzk");
cout << s1 << endl;

s1[2] = 's';
cout << s1 << endl;

运行结果如下:

  • 3.2 reserve

意义是提前开空间,避免了扩容,提高了效率,如果开的空间本就小于现在的空间,则无影响

string s1("mzk");
cout << s1 << endl;

s1.reserve(100);
cout << s1 << endl;

s1.reserve(1);
cout << s1 << endl;

运行结果如下:

  • 3.3 clear

清除string对象内的所有字符,但不清除容量

string s1("mzk");
cout << s1 << endl;

s1.clear();
cout << s1 << endl;

运行结果如下:

  • 3.4 reserve(逆置)

就如名称所示,将范围内的字符串逆置,范围由迭代器组成,用法如下:

string s1("mzk");
cout << s1 << endl;

reverse(s1.begin(), s1.end());
cout << s1 << endl;

运行结果如下:

要注意这里只能用迭代器表示范围,迭代器的内容可以观看这篇文章:迭代器基本知识 – 小园得志

  • 3.5 尾插字符串

1. append插入

尾插的字符串可以是string类型,也可以是char类型,具体使用方法如下:

string s2("mzk");
s2.append("ena");
cout << s2 << endl;

string s3("99");
s2.append(s3, 0, 2);
cout << s2 << endl;

同样的,如果尾插的是string对象,也可以像拷贝构造一样,规定尾插的起始点,第一个参数为下标,第二个参数为长度,此代码运行结果如下:

2.string::operator+

相对于上一个用法,我更推荐这个,因为直接加一个字符串或者string对象就可以了,更加的方便

string s2("mzk");
s2 = s2 + "ena";
cout << s2 << endl;

string s3("99");
s2 = s2 + s3;
cout << s2 << endl;

运行结果如下:

  • 3.6 erase(删除字符)

可以删除string对象内的一串字符,可以规定位置和长度,有两种用法,第一种是下标+长度,第二种是用迭代器表示范围

//利用下标+长度删除
string s2("enamzk99");
cout << s2 << endl;

s2.erase(s2.begin(), s2.begin() + 3);
cout << s2 << endl;

//利用迭代器删除
string s3("enamzk99");
cout << s3 << endl;

s3.erase(0, 3);
cout << s3 << endl;

要注意的是,第一种用法如果不加长度,就会将下标后的所有字符删除完,运行结果如下:

  • 3.7 replace(替换)

可以将字符串中的一部分字符串替换为其他字符串,具体用法为第一个参数填从哪个下标开始替换,第二个参数填长度,第三个参数填要替换的字符串

string s4("mzk ena love");
cout << s4 << endl;

s4.replace(4, 3, "knd mfy");
cout << s4 << endl;

要注意的是,删掉字符串后就从对应下标开始替换,如果替换字符串长度超过删除字符串长度,会自动向后扩容,并且不会覆盖后面的字符,运行结果如下:

  • 3.8 find(查找字符串)

用来查找字符串中的字符/字符串,返回第一个出现此字符/字符串的下标,没找到则返回-1第一个参数为要查找的字符/字符串,第二个参数为开始查找位置的下标

string s4("mzk ena love");
cout << s4 << endl;

int i = s4.find('z', 0);
cout << i << endl;

运行结果如下:

相反的是,我们还可以用rfind反向查找,用法与find相同,这里不过多介绍

  • 3.9 find_first_of(查找字符串)

与上述find不同的是,如果是字符串,只要能匹配上字符串中的一个字符就可以,然后返回这个字符的下标

string s4("mzk ena love");
cout << s4 << endl;

int j = s4.find_first_of("mzk", 0);
cout << j << endl;

运行结果如下:

同样的,find_last_of是反向查找的形式

4.通过输入来构造string对象

当我们正常使用cin来对string对象进行输入时,如果遇到空格就会跳过,为了解决这个问题,我们可以使用getline来解决问题,具体用法如下:

string s5;
getline(cin, s5);
cout << s5 << endl;

第一行为输入内容,运行结果如下:

还要强调的是,如果你想将终止符换为换行的其他字符,可以加入第三个参数作为终止符

string s5;
getline(cin, s5, 'e');
cout << s5 << endl;

这里则是遇到’e’这个字符就终止,当我输入“mzkena”时,运行结果如下:

结尾

当你看到这里时,你就已经将string的基本用法全部看完了,接下来就是在平常的代码中进行练习使用了

上一次更新已经跑远了✨ 计算中...
(‾◡◝) 本内容里的一些消息,可能已经跟不上时间啦~


评论(0)

查看评论列表

暂无评论


发表评论

表情 颜文字

插入代码
小园得志

北京时间 (Asia/Shanghai)

后退
前进
刷新
复制
粘贴
全选
删除
返回首页
0%
目录
顶部
底部
📖 文章导读