一、前言
之前学习了 C 风格 char 字符数组,操作繁琐易乱码、越界。std::string是 C++ 标准库封装的字符串类,内置大量成员方法,支持拼接、截取、查找、替换、清空、判空等操作,是开发首选字符串类型。使用前必须引入头文件#include <string>。
二、string 四种初始化方式
cpp
运行
#include <iostream>
#include <string>
using namespace std;
int main()
{
// 1. 直接字符串赋值
string s1 = "C++编程";
// 2. 构造函数初始化
string s2("学习string");
// 3. 拷贝初始化
string s3 = s1;
// 4. n个重复字符初始化
string s4(5, '*'); // "*****"
return 0;
}
三、字符串拼接、赋值
+运算符直接拼接字符串 / 字符
cpp
运行
string a = "Hello";
string b = " C++";
string c = a + b;
a += " World"; // 追加到自身
append()追加函数
cpp
运行
string s = "代码";
s.append("学习");
s.append(3,'!'); // 追加3个!
四、获取长度、判空
cpp
运行
string str = "test";
str.size(); // 返回有效字符数量,等价length()
str.empty(); // 返回bool,true代表空字符串
五、字符访问
下标访问
[],越界不报错,存在风险at()函数访问,下标越界抛出异常,更安全
cpp
运行
string s = "abc";
cout << s[0];
cout << s.at(1);
六、子串截取 substr
参数 1:起始下标;参数 2:截取字符个数(省略则截取到末尾)
cpp
运行
string s = "HelloWorld";
string sub1 = s.substr(0,5); // Hello
string sub2 = s.substr(5); // World
七、查找 find /rfind
find("子串"):从左向右查找,返回匹配起始下标,找不到返回string::nposrfind("子串"):从右向左反向查找
cpp
运行
string s = "I love C++, C++ easy";
size_t pos = s.find("C++");
if(pos != string::npos)
{
cout << "找到,下标:" << pos << endl;
}
八、替换 replace
格式:replace(起始下标, 替换长度, 新字符串)
cpp
运行
string s = "abc123abc";
s.replace(0,3,"XXX"); // 把前3个字符替换为XXX
九、删除 erase、清空 clear
cpp
运行
string s = "123456";
s.erase(0,2); // 从0下标删除2个字符
s.clear(); // 清空整个字符串,长度变为0
十、字符串比较
== / != / > / <直接运算符比较,按 ASCII 码逐字符对比compare()函数,相等返回 0,大于返回正数,小于返回负数
cpp
运行
string a = "apple", b = "banana";
if(a < b) cout << "a更小";
十一、读取带空格整行 getline
cin 读取遇到空格自动截断,读取完整带空格文本使用getline(cin,字符串)
cpp
运行
string msg;
cout << "输入一段带空格文字:";
getline(cin, msg);
cout << msg;
十二、新手易错点
忘记引入
<string>头文件,编译报错find 判断不用
string::npos,直接判断 pos==-1(部分环境不兼容)下标超出字符串长度,
[]无报错但内存乱码,优先使用 at ()cin 读取后残留换行符,导致后续 getline 读取空行
十三、综合实战:关键词过滤替换工具
cpp
运行
#include <iostream>
#include <string>
using namespace std;
// 敏感词替换为*
void filterWord(string &text, string badWord)
{
size_t pos = 0;
while((pos = text.find(badWord, pos)) != string::npos)
{
text.replace(pos, badWord.size(), string(badWord.size(), '*'));
pos += badWord.size();
}
}
int main()
{
string content;
cout << "输入文本:";
getline(cin, content);
filterWord(content, "垃圾");
filterWord(content, "违规");
cout << "过滤后文本:" << content << endl;
return 0;
}
十四、下期预告
下一篇:C++ 文件流 fstream 读写本地 txt 文档完整教程