C++中string成员函数length()与size()和strlen()的区别

首先看一下三个函数的申明:

//返回string长度,单位字节
size_t length() const noexcept;

//返回string长度,单位字节。作用等同于length()
size_t size() const noexcept;

//C标准库函数,返回C风格字符串长度,单位字节
size_t strlen ( const char * str );

实际项目中,C++ string获取长度时,我们经常使用以下两种方法。

//方法一:调用length()或size()
string strTest="test";
strTest.length();           //结果为4
strTest.size();             //结果为4

//方法二:转为C风格字符串,调用strlen()
strlen(strTest.c_str());    //结果为4

上面的代码片段获取的字符串长度均是4,看不出什么区别,那么方法一和方法二有什么区别呢?请看如下代码:

char buf[256]={0};
buf[0]='a';
buf[2]='v';
buf[3]='h';

string strTest(buf,6);
cout<<"strTest[0]:"<<(uint32_t)strTest[0]<<"_"<<(uint32_t)strTest[1]<<"_"<<(uint32_t)strTest[2]<<"_"<<(uint32_t)strTest[3]<<"_"<<(uint32_t)strTest[4]<<"_"<<(uint32_t)strTest[5]<<endl;
cout<<"strTest.length():"<<strTest.length()<<" strTest.size():"<<strTest.size()<<endl;
cout<<"strlen(strTest.c_str()):"<<strlen(strTest.c_str())<<endl;
cout<<"strTest:"<<strTest<<endl;

代码输出:

strTest[0]:97_0_118_104_0_0
strTest.length():6 strTest.size():6 strlen(strTest.c_str()):
strlen(strTest.c_str()):1
strTest:avh

结论: (1)当string中含有空字符’\0’,使用strlen()获取string的长度时会被截断,使用成员函数length()和size()可以返回string的真实长度。 (2)cout对string输出时,会过滤掉空字符,输出不会被截断。 (3)在构造或者拼接string时,建议同时指定string的长度,比如:

//构造时使用
string strTest(buf,6);

//而非,因为会被截断
string strTest(buf);

//拼接时使用
strTest.append(buf,6);
//而非,因为会被截断
strTest+=buf;

参考文献

[1]C++ reference

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏浪淘沙

Python学习总结4--字符串和编码

一、编码历史     由于计算机是美国人发明的,因此,最早只有127个字符被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCI...

14040
来自专栏琦小虾的Binary

map 学习(上)——C++中 map 的使用

map 学习(上)——C++中 map 的使用 欠下数据结构的债,迟早是要还的…… 最近写毕业论文过程中,需要用到哈希表的数据结构,此外空闲时间在刷 Leetc...

46560
来自专栏从流域到海域

《笨办法学Python》 第30课手记

《笨办法学Python》 第30课手记 本节课讲if语句的嵌套,和c的差别仅仅是将else if简写成elif,其余类似。 原代码如下: people = 30...

20870
来自专栏运维技术迷

连仕彤博客[Python练习] 将字典扁平化

1.isinstance():判断v的类型是不是字典,如果不是就直接写入新字典; 2.递归(函数循环) 3.嵌套函数

11720
来自专栏程序你好

.Net CSharp语言中When关键字的用法

c# 6引入了when关键字。when关键字是通过某些特定标准来过滤catch块中的异常的一种方法。后来在c# 7中扩展到case语句。我们将介绍如何在异常处理...

13100
来自专栏程序员互动联盟

【答疑解惑第六讲】数组与指针区别在哪?

存在问题: 小伙伴都说指针和数组不好学,总是搞不太清楚?两者到底有啥区别? 解决方案: 很多初学者朋友总是对数组和指针模模糊糊,搞不清楚。对他们之间的联系与区...

354110
来自专栏开发 & 算法杂谈

序列中查找第二小元素

序列中查找第二小元素有很多方法,本文介绍的是采用分治的思想,自底向上,序列中两两构成一对,比较选出最小值,然后构成上一层序列,然后依次网上构造,最后,根节点就是...

9530
来自专栏决胜机器学习

PHP数据结构(八) ——赫夫曼树实现字符串编解码(实践2)

PHP数据结构(八)——赫夫曼树实现字符串编解码(实践2) (原创内容,转载请注明来源,谢谢) 公众号规定不能超过3000字,只能分两篇,见谅。 由于需要分两篇...

35960
来自专栏图形学与OpenGL

实验2 C++数组与指针

10840
来自专栏数据分析

char varchar nchar nvarcharar到底有多大区别

首先说明下,ASP.NET MVC系列还在龟速翻译中。 工作好多年,基础知识甚是薄弱,决定以后在coding(cv操作)的时候尽量多google下,然后总结下来...

32660

扫码关注云+社区

领取腾讯云代金券