0

0

C++怎么截取字符串 C++中substr函数用法【技巧】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-03-12 17:19:56

|

638人浏览过

|

来源于php中文网

原创

substr是std::string成员函数,按字节截取子串:pos越界抛异常,len超长自动截断;UTF-8中文易乱码;推荐find定位后substr,大字符串优先用string_view避免拷贝。

c++怎么截取字符串 c++中substr函数用法【技巧】

substr 函数的基本用法和边界陷阱

substrstd::string 的成员函数,不是全局函数,调用前必须确保对象非空且索引合法。它有两个重载形式:substr(size_t pos)substr(size_t pos, size_t len)。第一个参数 pos 是起始位置(从 0 开始),第二个是截取长度 —— 不是“结束位置”,这点最容易错。

  • 如果 pos == str.length(),返回空字符串 "";这是合法的,不会崩溃
  • 如果 pos > str.length(),抛出 std::out_of_range 异常(Debug 模式下常见,Release 可能静默 UB)
  • len 超出剩余字符数时,自动截断到末尾,不会报错 —— 这是设计行为,不是 bug
  • 别写 s.substr(2, 5) 期望拿到第 2 到第 5 位:实际是“从下标 2 开始取 5 个字符”,即 [2, 6) 区间

中文、UTF-8 字符串用 substr 会乱码吗?

会,而且大概率乱码。substr 按字节操作,不识别 UTF-8 编码单元。一个汉字在 UTF-8 中占 3 字节,若 pos 落在某个汉字中间(比如偏移量为 1 或 4),截出来的就是非法 UTF-8 字节序列,后续 std::cout 或 JSON 库可能直接丢弃或显示 。

  • 纯 ASCII 场景(英文、数字、基本符号)完全安全
  • 含中文时,必须先用 ICU、utf8cpp 或手写逻辑将字符串转成 std::vector<:string></:string>(每个元素是一个完整 Unicode 码点),再按“字符数”而非“字节数”计算 poslen
  • 没有“万能安全 substr”,C++ 标准库不提供 Unicode 支持

替代方案:用 find + substr 提取子串更可靠

直接硬算下标容易出错,尤其当目标子串位置不确定时。更健壮的做法是先用 find 定位起始/结束标记,再传给 substr

std::string s = "name=alice&age=30&city=shanghai";
size_t start = s.find("age="); // 返回 9
if (start != std::string::npos) {
    start += 4; // 跳过 "age="
    size_t end = s.find('&', start);
    std::string age_str = (end == std::string::npos) 
        ? s.substr(start) 
        : s.substr(start, end - start); // 得到 "30"
}
  • find 返回 std::string::npos 表示未找到,必须检查,否则传给 substr 会触发异常
  • find_first_offind_last_of 可处理多分隔符场景(如空格、逗号、换行混用)
  • 避免多次 substr 链式调用(如 s.substr(a).substr(b)),每次都会分配新字符串,性能差

substr 性能与移动语义的关系

substr 总是返回新分配的 std::string,即使原字符串很大,它也不会共享内存或延迟拷贝。C++11 后虽支持移动语义,但 substr 本身不返回右值引用,无法触发移动优化。

Sora
Sora

Sora是OpenAI发布的一种文生视频AI大模型,可以根据文本指令创建现实和富有想象力的场景。

下载

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

  • 对大字符串频繁截取(如日志解析),考虑改用 std::string_view(C++17)避免拷贝:std::string_view sv = std::string_view(s).substr(pos, len)
  • string_view 不拥有数据,使用时必须确保原字符串生命周期长于 view
  • 旧标准(C++11/14)无 string_view,只能用指针+长度手动管理,风险更高

实际用 substr 时,最麻烦的从来不是语法,而是得同时盯住三件事:索引是否越界、编码是否被拆开、内存是否被反复拷贝。漏掉任意一个,问题就藏在看似正常的输出里。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

456

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

547

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

335

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1030

2023.08.02

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1566

2023.10.24

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.2万人学习

C 教程
C 教程

共75课时 | 5.4万人学习

C++教程
C++教程

共115课时 | 21.6万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号