C++ string substr怎么用 C++截取字符串子串操作演示【API】
技术百科
穿越時空
发布时间:2026-01-27
浏览: 次 substr第一个参数是起始位置(从0开始),第二个参数是截取长度而非结束下标;pos超界抛out_of_range,len超剩余长度则自动截断到末尾。
substr 的两个参数怎么填
substr 是 std::string 的成员函数,签名是 string substr(size_t pos = 0, size_t len = npos) const。第一个参数 pos 是起始位置(从 0 开始),第二

len 是要截取的长度,不是结束下标。
常见错误是把 len 当成“到第几个字符为止”,比如想取索引 2~5(共 4 个字符),写成 s.substr(2, 5) —— 这实际会取 5 个字符,可能越界或结果不对。
- 安全写法:明确长度,
s.substr(2, 4) - 如果只传一个参数,如
s.substr(3),表示从索引 3 到末尾 -
pos超出字符串长度(但 ≤s.length())时抛std::out_of_range;等于s.length()是合法的,返回空串 -
len超过剩余长度时,自动截断到末尾,不会报错
处理中文或 UTF-8 字符串时为什么 substr 会乱码
substr 按字节操作,不识别 UTF-8 编码边界。一个中文字符占 3 字节,若 pos 或 len 落在某个汉字中间,截出来就是非法 UTF-8 序列,显示为 或解析失败。
- 纯 ASCII 字符串(英文、数字、基本符号)可放心用
substr - 含中文、emoji 等场景,必须先转成 Unicode 码点再切分,例如用
std::wstring+std::mbstowcs,或引入 ICU / utf8cpp 库 - 简单规避:确保
pos和每个截断点都在字节边界上(比如只在空格、换行、ASCII 标点后切),但这不通用
替代方案:C++17 以后有没有更安全的切片方式
标准库没有内置的 UTF-aware 子串函数,但 C++17 引入了 std::string_view,它和 substr 行为一致(仍是字节级),只是开销更低——不拷贝数据,只持引用和长度。
- 性能敏感且确定是 ASCII 场景,优先用
string_view:string_view sv = s.substr(5, 3); - 注意:
string_view不拥有数据,原string生命周期必须长于它的使用期 - 真需要按字符切?只能手动遍历 UTF-8 字节序列,或依赖第三方,比如:
utf8::substr(s, start_char_index, char_count)(来自 utf8cpp)
常见报错 std::out_of_range 怎么快速定位
错误信息通常是:basic_string::substr: __pos (which is 12) > this->size() (which is 10)。说明你传的 pos 已经超出字符串当前长度。
- 检查是否忘了调用
.length()或.size()就直接算下标,比如s[i+5]前没判断i+5 - 用
at()替代[]可提前暴露越界访问,但它不解决substr参数问题 - 调试小技巧:在调用前加断言,
assert(pos ,或用三元表达式兜底:s.substr(pos > s.size() ? 0 : pos, len)
pos 和 len 的语义、UTF-8 边界、异常触发条件这三点,任一疏忽都会导致线上静默错误或崩溃。尤其服务端处理用户输入时,别假设输入全是英文。
# 都在
# 看着
# 第一个
# 英文
# 第二个
# c++
# String
# 编码
# 字节
# 标准库
# 字符串
# 报错
# 为什么
# 仍是
# this
# 成员函数
# 切片
# asic
# len
# ASCII
# 遍历
# const
# 落在
# Length
# 切分
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11此电脑不在桌面上_Windows 11桌
- c++的STL算法库find怎么用 在容器中查找指
- Python字符串操作教程_切片拼接与格式化详解
- Win11怎么设置默认图片查看器_Windows1
- Win11怎么更改管理员名字 Win11修改账户名
- Windows10电脑怎么设置文件权限_Win10
- Win11键盘快捷键大全_Windows 11常用
- c++怎么处理多线程死锁_c++ lock_gua
- SAX解析器是什么,它与DOM在处理大型XML文件
- Win11怎么打开旧版计算器_Win11恢复传统计
- Windows10如何更改系统字体大小_Win10
- Go 中 := 短变量声明的类型推导机制详解
- 如何使用Golang实现容器健康检查_监控和自动重
- Win11关机界面怎么改_Win11自定义关机画面
- c++中如何使用std::variant_c++1
- c++怎么调用nana库开发GUI_c++ 现代风
- Win10怎么卸载鲁大师_Win10彻底卸载鲁大师
- Win11如何卸载OneDrive_Win11卸载
- MySQL 中使用 IF 和 CASE 实现查询字
- 如何在Golang中实现自定义Benchmark_
- MAC如何快速搜索大文件_MAC磁盘空间分析与冗余
- 如何在Golang中写入XML文件_生成符合规范的
- C++中引用和指针有什么区别?(代码说明)
- Flask 表单数据通过 SMTP 发送邮件的完整
- Mac电脑进水了怎么办_MacBook进水后紧急处
- 如何在Golang中实现服务熔断与限流_Golan
- 如何用正则表达式精确匹配最多含一个换行符的起止片段
- MAC怎么使用表情符号面板_MAC Emoji快捷
- php订单日志怎么记录发货_php记录订单发货操作
- Win10怎么设置开机密码_Windows10账户
- Win10怎么限制单程序CPU占用上限_Win10
- Win11怎么开启自动HDR画质_Windows1
- c++中的std::conjunction和std
- ACF 教程:正确更新嵌套在多层 Group 字段
- Python项目维护经验_长期演进说明【指导】
- php订单日志怎么记录评价_php记录订单评价日志
- 如何在Golang中处理模块包路径变化_Golan
- 如何使用 Python 合并文件夹内多个 Exce
- Windows怎样拦截WPS弹窗广告_Window
- mac怎么安装pip_MAC Python pip
- How to Properly Use NumPy
- Win11蓝牙开关不见了怎么办_Win11蓝牙驱动
- Python与OpenAI接口集成实战_生成式AI
- Windows10电脑怎么设置自动连接WiFi_W
- Windows 11登录时提示“用户配置文件服务登
- Windows10如何查看蓝屏日志_Win10使用
- 如何使用Golang sync.Map实现并发安全
- C#如何使用XPathNavigator高效查询X
- c++中如何对数组进行排序_c++数组排序算法汇总
- Win11怎么开启远程桌面_Win11系统远程桌面

QQ客服