核心定位
蓝桥杯算法竞赛高频必备,字符串处理题的基础工具,无需死记所有函数原型,重点掌握竞赛高频用法 + 避坑点 + 组合技巧,以下按模块汇总,突出实用性、易读性,适配算法题场景。
通用基础
- 下标从0开始,最后一个字符下标为
s.size()-1; - 未找到指定内容时,返回常量
string::npos(判断是否找到的核心依据); - 单引号
'c'表示单个字符(char),双引号"str"表示C 风格字符串(const char*),二者不可混用(高频易错点); - 所有操作均需包含头文件
#include <string>。
一、3.1.2 构造函数
核心功能
创建 string 对象时初始化,4 种竞赛必用写法,灵活初始化不同格式字符串
高频用法(直接套用)
| 写法 | 效果 | 示例 | 输出 |
|---|---|---|---|
string s; | 空字符串 | string s; | 空 |
string s("C串"); | C 风格字符串初始化 | string s("hello"); | hello |
string s(s2); | 拷贝另一个 string | string s1("a"); string s2(s1); | a |
string s(n, 'c'); | n 个单个字符初始化 | string s(5, 'a'); | aaaaa |
核心避坑
string(n, 'c')的第二个参数必须是单引号包裹的单个字符,不可写string(5, "a")(类型不匹配报错)。
二、3.1.3 赋值操作
核心功能
给已存在的 string 对象重新赋值,区别于「构造函数(创建时初始化)」
高频用法(竞赛首选)
| 写法 | 效果 | 示例 | 输出 |
|---|---|---|---|
s = "C串"; | 赋值 C 风格字符串 | s = "world"; | world |
s = s2; | 赋值另一个 string | s1="a"; s2=s1; | a |
s.assign(n, 'c'); | 赋值 n 个单个字符 | s.assign(3, 'b'); | bbb |
s.assign("C串", n); | 赋值 C 串的前 n 个字符 | s.assign("hello", 3); | hel |
了解即可
assign("C串")/assign(s2):功能与=完全一致,=写法更简洁,优先使用。
三、3.1.4 字符串拼接
核心功能
在字符串末尾追加内容,+= 是竞赛主流(简洁),append 适配「精准截取部分内容拼接」
高频用法(竞赛首选)
1. += 运算符(80% 场景够用,优先用)
| 写法 | 效果 | 示例 | 输出 |
|---|---|---|---|
s += "C串"; | 追加 C 串 | s="a"; s+="bc"; | abc |
s += 'c'; | 追加单个字符 | s="ab"; s+='c'; | abc |
s += s2; | 追加另一个 string | s1="a"; s2="b"; s1+=s2; | ab |
2. append 精准拼接(仅截取部分时用)
| 写法 | 效果 | 示例 | 输出 |
|---|---|---|---|
s.append("C串", n); | 追加 C 串的前 n 个字符 | s="he"; s.append("llo",2); | hell |
s.append(s2, pos, n); | 追加 s2 中 pos 开始的 n 个字符 | s2="abcde"; s="h"; s.append(s2,1,3); | hbcd |
核心避坑
append(s2, pos, n)中,pos 是 s2 的起始下标,n 是要截取的字符数,非结束下标。
四、3.1.5 查找和替换
核心功能
查找:找字符 / 子串的下标(find = 首次出现,rfind = 最后一次出现);
替换:替换指定位置的字符 / 子串;
高频用法(蓝桥杯黄金组合:find/rfind + replace)
1. 查找(find/rfind)
| 写法 | 效果 | 关键场景 |
|---|---|---|
s.find("子串/字符", pos=0); | 从 pos 开始找首次出现的下标,pos 默认 0 | 判断子串是否存在、找分隔符(:/.)首次位置 |
s.rfind("子串/字符"); | 找最后一次出现的下标 | 拆分文件名 / 后缀(找最后一个.)、拆分路径 |
| 判断是否找到 | if (s.find("a") != string::npos) | 唯一正确判断方式,不可直接用if (s.find("a")) |
2. 替换(replace)
核心原型:s.replace(pos, n, 新内容) → 从 pos 开始,替换n 个字符为新内容(C 串 /string 均可)
| 示例 | 效果 | 输出 |
|---|---|---|
s="13812345678"; s.replace(3,4,"****"); | 手机号脱敏(替换中间 4 位) | 138****5678 |
s="abc123"; s.replace(3,3,"xyz"); | 替换指定位置子串 | abcxyz |
核心避坑
- 查找未找到时,必须用
!= string::npos判断,下标 0 会被判定为 false,直接用if (s.find("a"))会漏判; - replace 的第二个参数 n 是要替换的字符数,非结束下标。
五、3.1.6 字符串比较
核心功能
比较两个字符串的大小,按字符 ASCII 码逐字符对比(非比长度),相等返回 0,大于返回 1,小于返回 – 1
高频用法(竞赛首选:直接用运算符,抛弃 compare 函数)
| 运算符 | 效果 | 示例 | 结果 |
|---|---|---|---|
s1 == s2 | 判断相等 | "abc"=="abd" | false |
s1 != s2 | 判断不等 | "abc"!="abd" | true |
s1 > s2 | 按 ASCII 比大小 | "abd">"abc" | true |
s1 < s2 | 按 ASCII 比大小 | "abc"<"abcd" | true |
了解即可
s.compare(s2)/s.compare("C串"):功能与运算符完全一致,写法繁琐,竞赛不用。
核心规则 + 避坑
- 逐字符对比,直到找到第一个不同字符,ASCII 大的字符串整体更大;
- 若一个是另一个的前缀(如 abc/abcd),短字符串更小;
- 大小写敏感:A(65) < a(97),”Apple” < “apple”;
- 空字符串
""小于任何非空字符串。
竞赛场景
判断输入指令(yes/no)、字符串排序(配合sort)、按字典序筛选字符串。
六、3.1.7 字符存取
核心功能
读取 / 修改字符串中的单个字符,[] 运算符是竞赛绝对首选
高频用法
| 写法 | 效果 | 场景 |
|---|---|---|
s[pos] | 读取 / 修改 pos 位置的字符 | 逐字符遍历、统计字符、修改字符(转大小写 / 替换) |
s.at(pos) | 功能与 [] 一致 | 了解即可,竞赛不用(越界抛异常,无实际意义) |
实战示例(蓝桥杯高频)
cpp
string s = "abc123";
// 逐字符统计数字个数
int cnt = 0;
for (int i=0; i<s.size(); i++) {
if (s[i] >= '0' && s[i] <= '9') cnt++;
}
// 小写转大写
s[i] -= 32; // a(97)-A(65)=32
核心避坑
下标范围必须是0 ~ s.size()-1,不可写s[s.size()](越界导致程序崩溃)。
七、3.1.8 插入和删除
核心功能
插入:在指定位置添加字符 / 字符串;删除:删除指定位置的字符 / 字符串;
高频用法
1. 插入(insert)
| 写法 | 效果 | 竞赛场景 |
|---|---|---|
s.insert(pos, "C串/string"); | 在 pos 位置插入整串 | 加前缀(+86)、插分隔符(-/ ) |
s.insert(pos, n, 'c'); | 在 pos 位置插入 n 个单个字符 | 补 0(凑固定长度)、插占位符(#/*) |
2. 删除(erase)
| 写法 | 效果 | 竞赛场景 |
|---|---|---|
s.erase(pos, n); | 从 pos 开始删除 n 个字符 | 删分隔符、删无用字符(空格 / 数字) |
s.erase(pos); | 从 pos 开始删除到末尾 | 删字符串后缀(去掉多余字符) |
实战示例(格式补全 / 清理)
cpp
运行
string s = "1234";
s.insert(0, 6, '0'); // 补0凑10位 → 0000001234
s.erase(0, 2); // 删前2个0 → 00001234
核心避坑
pos 的合法范围:
- 插入:
0 ~ s.size()(pos=s.size () 表示插在末尾); - 删除:
0 ~ s.size()-1(超过则报错)。
八、3.1.9 子串(substr)
核心功能
提取字符串中的指定子串,蓝桥杯顶级高频,几乎与find/rfind绑定使用
核心原型
string substr(int pos = 0, int n = npos)
- pos:子串起始下标(必选);
- n:提取的字符数(可选,省略 / 传 string::npos 则提取到字符串末尾)。
高频用法
| 写法 | 效果 | 示例 | 输出 |
|---|---|---|---|
s.substr(pos); | 从 pos 提取到末尾 | s="hello"; s.substr(2); | llo |
s.substr(pos, n); | 从 pos 提取 n 个字符 | s="hello"; s.substr(1,3); | ell |
蓝桥杯黄金组合:find/rfind + substr(拆分字符串)
cpp
// 拆分文件名和后缀(超高频)
string filename = "test.txt";
size_t dot = filename.rfind("."); // 找最后一个.的下标
string name = filename.substr(0, dot); // 文件名:test
string suffix = filename.substr(dot); // 后缀:.txt
核心避坑
- n 是要提取的字符数,非结束下标(新手最易错):如提取下标 2~4 的子串,应写
substr(2,3),非substr(2,4); - pos 不可超过
s.size()-1(越界直接报错)。
蓝桥杯 string 核心黄金技巧(必背)
- 拆分字符串:
find/rfind找分隔符(:/.)+substr提取子串(文件名 / 手机号 / 路径拆分); - 字符串脱敏:
substr提取前后部分 ++=拼接占位符(****); - 格式补全:
insert(pos, n, '0')凑固定长度、加前缀(+86/NO.); - 字符统计 / 修改:
[]运算符逐字符遍历(统计数字 / 元音、转大小写、替换字符); - 判断子串存在:
if (s.find("子串") != string::npos)(唯一正确写法); - 删除无用内容:
erase删分隔符 / 空格,清理字符串格式。
以上内容覆盖蓝桥杯 99% 的 string 使用场景,无需死记,结合题目练 3-5 道字符串题即可完全掌握,核心是灵活组合各模块功能解决实际问题。