0

0

c++中如何获取字符串长度_c++ string length size区别【详解】

穿越時空

穿越時空

发布时间:2026-01-31 12:32:08

|

104人浏览过

|

来源于php中文网

原创

string::length()和string::size()完全等价,均返回size_t类型、O(1)时间复杂度的字符字节数,不计'\0';语义上length()侧重字符串长度,size()利于容器接口统一与泛型编程。

c++中如何获取字符串长度_c++ string length size区别【详解】

string::length() 和 string::size() 完全等价,选哪个都行

std::string 中,length()size() 是两个同义函数,返回值类型都是 size_t,行为完全一致,底层调用同一段逻辑。C++ 标准明确要求二者必须等效。

实际使用中可按语义偏好选择:length() 更贴近“字符串有多少字符”的直觉;size() 则和容器接口统一(比如 vector::size()),利于代码风格一致性。

  • 二者都不计算末尾的空字符 '\0' —— std::string 本身不以 '\0' 为结束标志,内部存储是独立管理的
  • 调用开销是 O(1),因为长度信息已缓存在对象内,不是遍历计数
  • 若字符串含 Unicode 多字节字符(如 UTF-8 编码的中文),它们返回的是字节数,不是“字符个数”(即不等价于 Unicode code point 数量)

c_str() + strlen() 是错误做法,除非你明确需要 C 风格兼容

有人会写 strlen(s.c_str()) 来获取长度,这不仅多余,还引入隐患:

  • c_str() 返回的 C 字符串保证以 '\0' 结尾,但 std::string 可能包含中间的 '\0' 字节(合法),此时 strlen() 会提前截断,返回错误结果
  • 多一次函数调用、多一次指针解引用,性能无优势
  • 如果 s 是空字符串或刚 move 构造而来,c_str() 的有效性虽有保障,但毫无必要绕路

只有当你正在对接 C API(比如 printf("%s", s.c_str()))且恰好手头只有 strlen 可用时,才考虑它 —— 但获取长度这件事本身,仍应优先用 s.length()

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

uBrand
uBrand

一站式AI品牌创建平台,在线品牌设计,AI品牌策划,智能品牌营销;uBrand帮助创业者轻松打造个性品牌!

下载

size() 在模板泛型编程中更安全

如果你写的函数要同时支持 std::stringstd::vector 或自定义容器,用 .size() 能直接适配大多数标准容器接口;而 .length() 仅存在于 std::string 和少数几个特化类型(如 std::array 没有 length())。

  • 泛型函数中写 container.size() 更通用,避免编译失败
  • std::string_view 同样只提供 size()length() 两个等价接口,但它的存在进一步强化了统一用 size() 的趋势
  • 注意:sizeof(s) 是错的——它返回的是 std::string 对象自身内存大小(通常 24 或 32 字节),和内容长度无关

容易忽略的细节:size_t 的符号性与比较陷阱

length()size() 返回 size_t(无符号整数),和有符号类型(如 intssize_t)混用时极易出错:

  • if (s.length() 会永远为 false —— 因为 -1 被提升为极大的正数(如 18446744073709551615
  • 循环中用 for (int i = s.length() - 1; i >= 0; --i) 会导致无限循环:当 i == 0 时,再执行 --i 会变成极大正数
  • 跨平台时注意:Windows 下 size_tunsigned long,Linux x64 是 unsigned long long,但对长度获取本身无影响

安全做法是:比较时统一用 size_t,或显式转成有符号类型(需先确认非负),循环倒序建议用 while (i-- > 0) 或从 0 正向遍历。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
string转int
string转int

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

483

2023.08.02

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

780

2023.08.22

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

97

2023.09.25

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

75

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

286

2023.11.28

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

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

320

2023.08.03

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

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

212

2023.09.04

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

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

1503

2023.10.24

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

30

2026.01.31

热门下载

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

精品课程

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

共48课时 | 8.2万人学习

Git 教程
Git 教程

共21课时 | 3.2万人学习

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

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