C++20起可用std::erase(s, '')直接删除所有反斜杠;C++11–19需用erase-remove惯用法:s.erase(remove_if(s.begin(), s.end(), [](char c){return c=='';}), s.end())。

用 std::erase 删除所有 '\'(C++20 起最简方案)
如果你的编译器支持 C++20,std::erase 是最直接、安全、可读性最高的选择。它原地修改字符串,自动处理迭代器失效问题,且语义清晰——就是“删掉所有匹配字符”。
-
std::erase是针对容器的非成员函数,对std::string专门重载,无需手写循环或算法 - 注意:反斜杠在 C++ 字符串字面量中是转义字符,所以写
'\'才表示一个真正的反斜杠字符 - 不能写成
"\"(这是字符串字面量),必须用单引号的字符字面量'\'
std::string s = "a\b\\c"; std::erase(s, '\'); // s 变为 "abc"
用 std::remove_if + erase(C++11~C++19 兼容写法)
在 C++20 之前,标准库没有 std::erase,通用做法是“移除-擦除惯用法(erase–remove idiom)”。它分两步:先逻辑移动非目标字符到前端,再物理删除尾部冗余部分。
-
std::remove_if不真正删除元素,只是重排并返回新逻辑终点迭代器;必须配合string::erase才完成真实删除 - 误只调用
std::remove_if是常见错误,会导致字符串末尾残留旧字符(看似没变或出现乱码) - 判断条件用
[](char c) { return c == '\'; },别漏掉==写成=
std::string s = "x\y\z";
s.erase(std::remove_if(s.begin(), s.end(), [](char c) { return c == '\'; }), s.end());
为什么不用 std::replace 或正则?
有人会想到用 std::replace 把 '' 换成空格或 '<p>有人会想到用 <code>std::replace 把 '\' 换成空格或 ' ',但这不是删除——它保留原长度,只是替换内容,字符串里依然有“占位”,后续遍历时仍会遇到(除非你额外截断)。正则(std::regex_replace)更重,性能差、编译慢、易出错,纯属杀鸡用牛刀。
std::regex_replace)更重,性能差、编译慢、易出错,纯属杀鸡用牛刀。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
std::replace(s.begin(), s.end(), '\', ' ')→ 得到"x y z",不是"xyz" -
std::replace(s.begin(), s.end(), '\', ' ')→ 字符串内部多出空字符,但s.size()不变,c_str()截断,行为不可靠 -
std::regex_replace对单字符删除毫无优势,且\在正则里要写成"\\",极易混淆
Windows 路径字符串里删反斜杠要特别小心
如果源字符串是 Windows 文件路径(如 "C:\Users\name\file.txt"),直接删所有 '\' 会破坏路径结构,变成 "C:Usersnamefile.txt" —— 这通常不是你想要的。此时应明确目的:
立即学习“C++免费学习笔记(深入)”;
- 若想标准化路径分隔符(比如转成 Unix 风格),该用
'/'替换,而不是删除 - 若真要删,确认是否包含驱动器前缀(
"C:"后第一个'\'不能删)或网络路径("\\server\share") - 更稳妥的做法:用
std::filesystem::path解析后再操作,避免手动字符串处理
反斜杠本身在 C++ 字符串里就是个普通字符,但它的双重身份(字面量转义符 + 路径分隔符)最容易让人在写测试用例时搞混原始输入到底有几个反斜杠。

















