最简单方法是用for循环原地赋值并检查索引越界;手机号掩码第4~7位(0-based)需确保s.length()>=7;身份证应手动切片而非正则;通用函数需用枚举封装语义化参数并断言非空;utf-8中文须转u32string按字符操作。

如何用 std::string 实现固定位置掩码(如手机号中间4位)
直接改原字符串指定下标最简单,但必须确认索引不越界。C++ 没有内置“掩码范围”函数,得手动计算起始和长度。
-
substr()+ 字符串拼接虽直观,但会触发多次内存分配,高频调用时注意性能 - 推荐用
for循环遍历并原地赋值:比如手机号"13812345678",掩码第4~7位(0-based),即s[3]到s[6],统一设为'*' - 务必先检查
s.length() >= 7,否则s[6]访问未定义行为——这是线上最常触发的std::out_of_range或段错误
身份证号脱敏:正则匹配 vs 手动切片?
身份证是18位固定格式,正则(如 std::regex)反而重且慢,还引入 ICU 依赖风险;手动切片更稳。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 取前6位 +
"****"+ 后4位:用s.substr(0, 6) + "****" + s.substr(s.length()-4) - 注意:
substr(pos, len)中len超出长度时自动截断,但pos超限会抛异常,所以必须先判s.length() == 18 - 若需兼容15位旧证,不能硬写
18,应先用s.length()分支处理
通用掩码函数怎么设计才不踩坑?
别写成 mask(str, start, end) 这种裸坐标接口——用户传错顺序或负数就崩。封装一层语义化参数。
- 用枚举定义掩码类型:
enum class MaskType { PHONE, ID_CARD, EMAIL_LOCAL, CUSTOM } - 对
CUSTOM类型,再接收std::pair<size_t size_t></size_t>表示 [start, end) 区间(左闭右开更符合 STL 习惯) - 所有入口函数第一行加断言:
assert(!s.empty());,开发期快速暴露空输入问题 - 返回
std::string而非引用——避免生命周期陷阱,尤其当输入是临时对象时
中文字符、UTF-8 多字节场景下为什么 substr() 会错?
std::string::substr() 按字节索引,不是按 Unicode 字符。一个中文字符占 3 字节,若按“第2个字符”掩码,直接用 substr(2, 1) 会切出乱码。
- 纯 ASCII 场景(如手机号、邮箱用户名)可放心用字节索引
- 含中文时,必须先用 UTF-8 解码库(如
utf8cpp)转成std::u32string,再按字符位置操作,最后转回 UTF-8 - 如果业务明确不处理中文(如只脱敏日志中的英文字段),文档里必须写死这条限制,否则下游误用会埋雷
\0)的输入——这些边界在测试环境很难覆盖,建议在函数开头加一行日志打印原始长度和首尾字符。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










