讲师中心 微信公众号

工具推荐

视频效率加速
Seko
Seko

AI短剧一键生成成片

AniShort
AniShort

AI短剧协同制作平台

剧云
剧云

中文短剧剧本制作平台

立刻MV
立刻MV

低成本歌曲 MV、视频生成

c++中如何实现字符串的按长度分割_c++指定长度拆分字符串方法【详解】

冬杰酱_7815

冬杰酱_7815

发布时间:2026-01-19 16:30:01

|

1007人浏览过

|

来源于php中文网

原创

最直接方式是用substr()配合循环切分字符串,C++11起兼容,自动处理末段不足长度情况,需检查len为0避免未定义行为;C++17可用string_view避免拷贝。

c++中如何实现字符串的按长度分割_c++指定长度拆分字符串方法【详解】

用 substr() 循环切分最直接

标准库没有内置“按固定长度拆分字符串”的函数,但 substr() 配合循环是最常用、最可控的方式。它不依赖第三方,兼容所有 C++ 标准(C++11 起即可),且避免了额外内存拷贝或正则开销。

关键点是:每次从 i 位置取 len 个字符,i 每次递增 len,但要注意最后一段可能不足 len,substr() 会自动截断到末尾,无需手动判断长度上限。

std::vector<std::string> split_by_length(const std::string& s, size_t len) {
    std::vector<std::string> result;
    if (len == 0) return result;
    for (size_t i = 0; i < s.length(); i += len) {
        result.push_back(s.substr(i, len));
    }
    return result;
}
  • substr(i, len) 在 i + len > s.length() 时自动取到结尾,安全
  • 传入 len == 0 会导致无限循环或未定义行为,必须提前检查
  • 如果原字符串含 null 字符('\0'),std::string 仍能正确处理,因为它是基于长度而非 C 风格终止

用 std::string_view 避免拷贝(C++17+)

若只需遍历或只读访问每段,用 std::string_view 替代 std::string 可省去每次 substr() 的内存分配和复制,尤其对大字符串或高频调用场景明显。

注意:string_view 是非拥有型视图,其生命周期不能超过原字符串;返回 vector<string_view></string_view> 时,务必确保原字符串在结果使用期间不被销毁。

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

Windows 开机自启并隐藏到系统托盘
Windows 开机自启并隐藏到系统托盘

让 Windows 桌面程序在开机时静默自启并隐藏到系统托盘。特别适用于 Flutter、Electron 等无视 VBS/ProcessStartInfo 窗口样式、难以隐藏的顽固应用。提供「VBS 启动器 + Python ctypes/Win32 API」的隐藏窗口方案,可稳定把窗口收进托盘且不闪控制台。

下载
std::vector<std::string_view> split_by_length_view(const std::string& s, size_t len) {
    std::vector<std::string_view> result;
    if (len == 0) return result;
    for (size_t i = 0; i < s.length(); i += len) {
        result.emplace_back(s.data() + i, std::min(len, s.length() - i));
    }
    return result;
}
  • 显式用 std::min(len, s.length() - i) 计算当前段长度,比依赖 substr 更清晰可控
  • data() + i 是合法的指针偏移,前提是 i (循环条件已保证)
  • 若后续要存入容器长期使用,或需要修改内容,必须转成 std::string,否则会悬垂

遇到中文等 UTF-8 字符串要小心

C++ 标准库字符串操作一律按字节处理,不识别 Unicode 码点。UTF-8 中一个汉字占 3 字节,若按固定字节长度切分,很可能把一个汉字从中截断,导致乱码或解析失败。

没有通用零成本方案——真正按“字符数”切分需用 ICU、utf8cpp 或手写 UTF-8 解码逻辑。日常工程中,若确定输入为纯 ASCII,可忽略;否则必须明确需求:是按字节切(如协议分包),还是按 Unicode 字符切(如文本排版)。

  • 用 std::wstring + std::locale 不解决 UTF-8 问题,Windows 上默认 locale 对 UTF-8 支持有限
  • 简单跳过非法 UTF-8 字节序列不可靠,可能掩盖数据损坏
  • 若协议约定“每 N 字节一帧”,那就该按字节切——此时“切开汉字”不是 bug,而是设计使然

别用 std::regex 做定长分割

有人尝试写类似 std::regex("(.{1,5})") 来匹配每 5 字符一段,但这是反模式:

  • regex 构造和匹配开销远高于循环 substr,尤其短字符串下更明显
  • 贪婪匹配 .{1,5} 在边界处可能吞掉换行或空格,行为不易预测
  • C++11 的 std::regex 实现质量参差,libstdc++ 曾长期不支持某些特性,MSVC 也有过 bug
  • 正则无法自然表达“从头开始、严格每 N 字节一截”,容易漏掉末尾或重叠匹配

除非你已经在用正则做其他复杂文本分析,且顺带复用,否则纯定长分割没必要引入 regex。

实际用哪个方法,取决于你是否需要所有权、是否处理 Unicode、以及 C++ 标准版本。最常踩的坑不是语法,而是默认当成“字符数”切分 UTF-8 字符串——而 C++ 里根本没有“字符数”这个概念,只有字节、char、或你自己解码出来的 code point。

热门AI工具

更多
DeepSeek

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

函子Zion

一款支持AI搭建、可视化编辑和多端发布的全栈无代码开发平台。

立刻MV
立刻MV Hot

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

讯飞智作

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

WorkBuddy

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

豆包大模型

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

SkildArt
SkildArt Hot

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

火山引擎

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

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

更多
string转int
string转int

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

7439

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

569

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

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

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

1918

2023.08.03

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

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

3164

2023.09.04

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

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

6364

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

6509

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

8034

2024.03.22

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

0

2026.11.12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Conan 2 安装指南
Conan 2 安装指南

共0课时 | 0人学习

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

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