C++ string 成员函数 length() size() 和 C strlen() 的区别
1.函数申明
C++ string 成员函数 length() 等同于 size(),但是和 C 库函数 strlen() 有着本质区别,使用时切勿混淆。首先看一下三个函数的申明:
// 返回 string 长度,单位字节
size_t length() const noexcept;// 返回 string 长度,单位字节。作用等同于 length()
size_t size() const noexcept;// C 标准库函数,返回C风格字符串长度,单位字节
size_t strlen ( const char * str );
2.使用示例
实际项目中,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()<<" 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())=1
strTest:avh
3.结论
(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
C++ string 成员函数 length() size() 和 C strlen() 的区别相关推荐
- c++成员函数的重载、覆盖、隐藏区别
c++成员函数的重载.覆盖.隐藏区别 成员函数的重载.覆盖(override)与隐藏很容易混淆,C++程序员必须要搞清楚概念,否则错误将防不胜防. 重载与覆盖 成员函数被重载的特征: (1)相同的范围 ...
- C++成员函数重载、覆盖和隐藏的区别
*************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...
- string函数_C++[06] string成员函数之删除函数erase
介绍一下删除函数erase,老方法,新建cpp文件,并找到string的erase成员函数,可以看到,erase有3个重载函数 右键转到定义,可以查看erase的源码 _Myt& erase( ...
- C++中string类的length()与size()方法和C语言的strlen()函数有什么区别?
直接上代码段: char buf[256]={0}; buf[0]='a'; buf[2]='v'; buf[3]='h';string strTest(buf,6); cout<<&qu ...
- leetcode中使用c++需要注意的点以及各类容器的初始化、常用成员函数
目录 1.传引用 2.vector使用 初始化方法 常用成员函数 3.字符串string 初始化方法 常用成员函数 4.哈希表 unordered_map 初始化 常用成员函数 示例:计数器 5.哈希 ...
- C语言输出长方柱的体积,需要求3个长方柱的体积,请编写一个基于对象的程序。数据成员包括length(长)、width(宽)、 height(高)。要求用成员函数实现以下功能...
需要求3个长方柱的体积,请编写一个基于对象的程序.数据成员包括length(长).width(宽). height(高).要求用成员函数实现以下功能: (1) 由键盘分别输入3个长方柱的长.宽.高: ...
- 【笔试】:编程实现C++string 类成员函数
http://blog.csdn.net/wangshihui512/article/details/9792309 已知String类声明如下: [cpp] view plaincopy print ...
- String类 写出类的成员函数实现
*************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...
- list排序成员函数对string对象与char*对象排序的差别
对list容器中的对象排序,不能使用sort()算法,只能采用其自身的排序函数sort().因为,算法sort()只支持随机存取的容器的排序,如vector等. 对基本数据对象list排序:成员函数s ...
最新文章
- Codeforces ECR50 div2题解
- 微软,您的.net为中国程序员带来了什么?
- 男神鹏:人工智能人脸识别操作。
- tensorflow教程 学习笔记 之 Eager execution 急切执行
- 经验:Windows To Go准备工作
- 【操作系统】死等状态、忙等状态、有限等待、让权等待
- python yield理解_Python3 中 Yield 理解与使用
- Kaldi语音识别:基于aidatatang模型实现自制语音数据的识别
- 怎么使用java初始化链表_Java链表基本操作和Java.util.ArrayList
- 一分钟教会你固态硬盘数据恢复方法
- 荣耀9换从服务器获取安装包信息失败,华为荣耀9解锁BootLoader教程 荣耀9获取解锁码进行解锁...
- python步态识别算法_步态识别问题3
- 使用Neo4j分析《权力的游戏》
- google关键词匹配和扩展工具
- split(),slice(),splice()的区别与应用
- 张正友棋盘法定标--Matlab【Camera Calibration Toolbox】
- 新闻主题分类任务——torchtext 库进行文本分类
- 长短时记忆神经网络python代码_零基础入门深度学习(6) - 长短时记忆网络(LSTM)
- 如何用js实现图片下载
- 如何在年薪10万的上班族让自己第二年达到20万以上?