讲师中心 微信公众号
AI工具推荐 视频效率加速

C++如何去掉字符串中包含的特定特殊符号

小枫小哥_5608

小枫小哥_5608

发布时间:2026-08-01 18:19:26

|

725人浏览过

|

来源于php中文网

原创

C++20前用std::remove_if+erase最稳妥,需配合erase才能真正删除;C++20起可用std::erase_if一行解决;避免find+erase循环以防越界或死循环;删多字节字符需Unicode感知处理。

c++如何去掉字符串中包含的特定特殊符号

std::remove_if + std::erase 删除指定字符(C++20 之前最稳妥方式)

直接修改原字符串、不额外分配内存、支持任意字符集(包括中文、emoji),这是最常用也最不容易出错的做法。关键点在于:不能只调用 std::remove_if,它只是把目标字符“挪到末尾”,真正删掉得靠后续的 erase

  • std::remove_if 返回的是新逻辑结尾的迭代器,必须和 erase 配合才能真正缩短字符串长度
  • 判断逻辑写在 lambda 里,比如去掉 '*''#''@',就用 [&](char c) { return c == '*' || c == '#' || c == '@'; }
  • 注意:如果字符串含 null 字符 ''std::string 仍能正常处理,但别误用 c_str() 后的 C 风格函数(如 strchr)去操作,会提前截断
std::string s = "a#b@c*d";
s.erase(std::remove_if(s.begin(), s.end(), [](char c) {
    return c == '#' || c == '@' || c == '*';
}), s.end());
// s 变成 "abcd"

std::erase(C++20 起,一行解决)

C++20 引入了容器专属的 std::erasestd::erase_if,对 std::string 直接生效,语义清晰、不用记迭代器配对。

  • 仅限 C++20 或更高标准,编译时需加 -std=c++20(GCC/Clang)或启用相应语言模式(MSVC)
  • std::erase_if(s, [](char c) { return ... })remove_if+erase 少写一半代码,且不易漏掉 erase
  • 底层仍是移动+resize,性能和前者一致,不是“复制新串”
std::string s = "x!y?z%";
std::erase_if(s, [](char c) { return c == '!' || c == '?' || c == '%'; });
// s 变成 "xyz"

误用 find + erase 循环的常见崩溃点

有人习惯写 while ((pos = s.find(c)) != std::string::npos) s.erase(pos, 1);,这在单字符删除时看似可行,但一遇到连续重复符号就容易越界或漏删。

C++
C++

"空空如也"

下载
  • 每次 erase 后字符串变短,后续 find 返回的位置可能已失效;若删的是首字符,所有索引偏移都会变化
  • 更糟的是:如果删的是空格或制表符这类常见符号,而字符串里有多个连续出现(如 "a b" 中两个空格),find 找到第一个后删掉,第二个位置前移,但下次 find 还是从头开始搜,可能反复命中同一位置导致死循环或崩溃
  • 除非你明确控制索引递进(如 pos = s.find(c, pos + 1)),否则不建议这种写法

需要保留部分特殊符号、只删特定子集时怎么写判断逻辑

实际场景中往往不是“删所有非字母数字”,而是“只删其中几个干扰符号”,比如日志解析时去掉 '['']''|',但保留 '-''.'

立即学习C++免费学习笔记(深入)”;

  • 把要删的字符存进 std::unordered_set<char> 是最直观的方式,尤其当集合较大(>5 个)时,查找是 O(1)
  • 避免写超长的 || 链:既难读又影响编译器优化;也不要硬编码 ASCII 范围(如 c < 32),因为 UTF-8 多字节字符的单字节值无意义
  • 若需按 Unicode 类别过滤(如删所有标点),就得用 ICU 或 C++20 的 <locale>,但代价高,绝大多数情况用字符白/黑名单就够了
const std::unordered_set<char> to_remove = {'[', ']', '|', '\', '''};
std::erase_if(s, [&](char c) { return to_remove.count(c); });
真正容易被忽略的是:不同编码环境下,同一个“符号”可能占多个 char(比如 UTF-8 中的 emoji),这时基于 char 的删除只删字节,不是删字符。如果业务涉及多语言文本,得先确认输入是否严格 ASCII,否则得换成 std::u8string + Unicode-aware 库处理。

热门AI工具

更多
Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2068

2024.03.14

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

959

2024.03.14

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

367

2024.03.14

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

307

2024.03.14

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

346

2024.03.14

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

560

2024.03.14

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

1389

2024.03.21

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

1177

2024.03.22

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

0

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn