C++20用std::erase(s, '"')或std::erase(s, '\'')可安全删除所有双引号或单引号;C++11–19需用erase–remove惯用法:s.erase(remove_if(s.begin(), s.end(), [](char c){return c=='"'||c=='\'';}), s.end())。

用 std::erase 删除所有单引号或双引号(C++20)
如果你的编译器支持 C++20,std::erase 是最直接、安全的方式,它会原地修改字符串并自动处理迭代器失效问题。
- 对
std::string调用std::erase(s, '"')可删掉所有双引号;std::erase(s, '\'')删所有单引号 - 注意单引号字面量要写成
'\''(转义),否则编译报错:error: missing terminating ' character - 该函数不改变剩余字符顺序,也不分配新内存,性能优于手写循环
用 std::remove_if + erase(C++11 及以上通用方案)
C++11 到 C++19 必须组合使用 std::remove_if 和成员函数 erase,这是“删除-擦除惯用法”(erase–remove idiom)的标准写法。
- 删双引号:
s.erase(std::remove_if(s.begin(), s.end(), [](char c) { return c == '"'; }), s.end()); - 删单引号:
s.erase(std::remove_if(s.begin(), s.end(), [](char c) { return c == '\''; }), s.end()); - 不能只用
std::remove_if:它只是把待删字符移到末尾并返回新逻辑终点,字符串长度不变 - lambda 中的
c == '\''容易漏掉反斜杠,务必写成'\'',否则语法错误
手动遍历 + erase 为什么容易出错
新手常写 for 循环配合 s.erase(i),但极易越界或跳过相邻引号。
- 错误示例:
for (size_t i = 0; i —— <code>erase后后续字符前移,但i仍自增,导致下一个字符被跳过 - 若改用
while并在删除时不递增i,又容易因s.size()动态变化引发size_t下溢(如i--到 -1 变成极大正数) - 即使加边界检查,也比
remove_if多 3~4 倍代码量,且无性能优势
要不要考虑 Unicode 或宽字符(std::wstring)
纯 ASCII 引号(' 和 ")在 UTF-8 编码的 std::string 中仍是单字节,上述方法完全适用。
立即学习“C++免费学习笔记(深入)”;
- 如果字符串实际是 UTF-8 但含中文等多字节字符,只要目标引号本身是 ASCII,
std::erase或remove_if依然安全——它们按字节操作,而 ASCII 引号不会出现在 UTF-8 多字节序列中间 - 若用
std::wstring存储 UTF-16/UTF-32,则需对应用L'"'和L'\'',且确保输入源编码一致,否则匹配失败 - 真正需要 Unicode 感知处理(如删「「」」等全角引号)时,必须引入 ICU 或
std::text(C++23),基础字符串算法不再适用
-std=c++20,再检查 '\'' 有没有少斜杠。


















