C++ string 核心操作全汇总(3.1.2-3.1.9)
本文最后更新于 34 天前,其中的信息可能已经有所发展或是发生改变。

核心定位

蓝桥杯算法竞赛高频必备,字符串处理题的基础工具,无需死记所有函数原型,重点掌握竞赛高频用法 + 避坑点 + 组合技巧,以下按模块汇总,突出实用性、易读性,适配算法题场景。

通用基础

  1. 下标从0开始,最后一个字符下标为s.size()-1
  2. 未找到指定内容时,返回常量string::npos(判断是否找到的核心依据);
  3. 单引号'c'表示单个字符(char),双引号"str"表示C 风格字符串(const char*),二者不可混用(高频易错点);
  4. 所有操作均需包含头文件#include <string>

一、3.1.2 构造函数

核心功能

创建 string 对象时初始化,4 种竞赛必用写法,灵活初始化不同格式字符串

高频用法(直接套用)

写法效果示例输出
string s;空字符串string s;
string s("C串");C 风格字符串初始化string s("hello");hello
string s(s2);拷贝另一个 stringstring 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;赋值另一个 strings1="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;追加另一个 strings1="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

核心避坑

  1. 查找未找到时,必须用!= string::npos判断,下标 0 会被判定为 false,直接用if (s.find("a"))会漏判;
  2. 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串"):功能与运算符完全一致,写法繁琐,竞赛不用。

核心规则 + 避坑

  1. 逐字符对比,直到找到第一个不同字符,ASCII 大的字符串整体更大;
  2. 若一个是另一个的前缀(如 abc/abcd),短字符串更小
  3. 大小写敏感:A(65) < a(97),”Apple” < “apple”;
  4. 空字符串""小于任何非空字符串。

竞赛场景

判断输入指令(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

核心避坑

  1. n 是要提取的字符数,非结束下标(新手最易错):如提取下标 2~4 的子串,应写substr(2,3),非substr(2,4)
  2. pos 不可超过s.size()-1(越界直接报错)。

蓝桥杯 string 核心黄金技巧(必背)

  1. 拆分字符串find/rfind找分隔符(:/.)+ substr提取子串(文件名 / 手机号 / 路径拆分);
  2. 字符串脱敏substr提取前后部分 + +=拼接占位符(****);
  3. 格式补全insert(pos, n, '0')凑固定长度、加前缀(+86/NO.);
  4. 字符统计 / 修改[]运算符逐字符遍历(统计数字 / 元音、转大小写、替换字符);
  5. 判断子串存在if (s.find("子串") != string::npos)(唯一正确写法);
  6. 删除无用内容erase删分隔符 / 空格,清理字符串格式。

以上内容覆盖蓝桥杯 99% 的 string 使用场景,无需死记,结合题目练 3-5 道字符串题即可完全掌握,核心是灵活组合各模块功能解决实际问题。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇