应先检查字符串长度≥2且首尾均为引号,再用erase(0,1)和erase(n-2,1)安全删除,或用substr(1,s.length()-2)更简洁;对转义引号需按实际解析逻辑处理。

如何用 std::string::erase 安全去掉首尾引号
直接调用 erase 去掉首尾字符,但必须先检查字符串非空且两端确实是引号,否则会触发 out_of_range 或误删其他字符。
- 先判断长度是否 ≥ 2,再检查
front()和back()是否都为'"'(或''',依需求而定) - 满足条件后,用
s.erase(0, 1)删开头,再s.erase(s.size()-1, 1)删结尾;或一步写成s.erase(0, 1).erase(s.size()-1, 1)(注意:第二个erase的索引要基于擦除前的长度) - 更稳妥写法是:先保存原长
auto n = s.length(),再s.erase(0, 1).erase(n-2, 1)
用 substr 提取中间子串更简洁
比 erase 更少副作用,适合只读场景或需要保留原字符串时。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 同样需前置校验:
s.length() >= 2 && s.front() == '"' && s.back() == '"' - 满足后直接返回
s.substr(1, s.length()-2)—— 第二个参数是长度,不是结束位置 - 若字符串只有两个引号(如
""""),substr(1, 0)合法,结果为空串"" - 不处理嵌套或转义引号(如
""a\"b""),这种需额外解析逻辑
处理带转义的双引号怎么办
标准库不自动识别转义序列,""" 这种字符串在 C++ 源码里实际是三个字符:'"', '\', '"' ,但运行时字符串内容就是 """(两个字符),不会被当作“带引号的字符串”。
- 真正含转义引号的字符串(如从 JSON 解析来的
""hello\"world"")中,首尾仍是未转义的",中间的"是独立字符,不影响首尾剥离 - 如果你拿到的是字面量
""a\"b"",编译后内存里是"a"b"(首尾双引号 + 中间一个"),此时仍可用前述方法去首尾 - 若需跳过所有转义符再找真实引号边界(比如解析自定义格式),就得手写扫描逻辑,不能依赖简单首尾判断
用 std::string_view 避免拷贝(C++17+)
如果只是临时查看或传递,不修改原串,string_view 是零开销方案。
- 校验同上,然后构造视图:
std::string_view sv{s.data()+1, s.size()-2} - 注意:原
std::string生命周期必须长于string_view,否则悬垂 - 不能对
sv调用remove_prefix/remove_suffix来“去掉引号”,因为那只是移动指针,不改变内容含义;你仍需自己管理起始偏移和长度
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










