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() 的区别相关推荐

  1. c++成员函数的重载、覆盖、隐藏区别

    c++成员函数的重载.覆盖.隐藏区别 成员函数的重载.覆盖(override)与隐藏很容易混淆,C++程序员必须要搞清楚概念,否则错误将防不胜防. 重载与覆盖 成员函数被重载的特征: (1)相同的范围 ...

  2. C++成员函数重载、覆盖和隐藏的区别

    *************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...

  3. string函数_C++[06] string成员函数之删除函数erase

    介绍一下删除函数erase,老方法,新建cpp文件,并找到string的erase成员函数,可以看到,erase有3个重载函数 右键转到定义,可以查看erase的源码 _Myt& erase( ...

  4. 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 ...

  5. leetcode中使用c++需要注意的点以及各类容器的初始化、常用成员函数

    目录 1.传引用 2.vector使用 初始化方法 常用成员函数 3.字符串string 初始化方法 常用成员函数 4.哈希表 unordered_map 初始化 常用成员函数 示例:计数器 5.哈希 ...

  6. C语言输出长方柱的体积,需要求3个长方柱的体积,请编写一个基于对象的程序。数据成员包括length(长)、width(宽)、 height(高)。要求用成员函数实现以下功能...

    需要求3个长方柱的体积,请编写一个基于对象的程序.数据成员包括length(长).width(宽). height(高).要求用成员函数实现以下功能: (1) 由键盘分别输入3个长方柱的长.宽.高: ...

  7. 【笔试】:编程实现C++string 类成员函数

    http://blog.csdn.net/wangshihui512/article/details/9792309 已知String类声明如下: [cpp] view plaincopy print ...

  8. String类 写出类的成员函数实现

    *************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...

  9. list排序成员函数对string对象与char*对象排序的差别

    对list容器中的对象排序,不能使用sort()算法,只能采用其自身的排序函数sort().因为,算法sort()只支持随机存取的容器的排序,如vector等. 对基本数据对象list排序:成员函数s ...

最新文章

  1. Codeforces ECR50 div2题解
  2. 微软,您的.net为中国程序员带来了什么?
  3. 男神鹏:人工智能人脸识别操作。
  4. tensorflow教程 学习笔记 之 Eager execution 急切执行
  5. 经验:Windows To Go准备工作
  6. 【操作系统】死等状态、忙等状态、有限等待、让权等待
  7. python yield理解_Python3 中 Yield 理解与使用
  8. Kaldi语音识别:基于aidatatang模型实现自制语音数据的识别
  9. 怎么使用java初始化链表_Java链表基本操作和Java.util.ArrayList
  10. 一分钟教会你固态硬盘数据恢复方法
  11. 荣耀9换从服务器获取安装包信息失败,华为荣耀9解锁BootLoader教程 荣耀9获取解锁码进行解锁...
  12. python步态识别算法_步态识别问题3
  13. 使用Neo4j分析《权力的游戏》
  14. google关键词匹配和扩展工具
  15. split(),slice(),splice()的区别与应用
  16. 张正友棋盘法定标--Matlab【Camera Calibration Toolbox】
  17. 新闻主题分类任务——torchtext 库进行文本分类
  18. 长短时记忆神经网络python代码_零基础入门深度学习(6) - 长短时记忆网络(LSTM)
  19. 如何用js实现图片下载
  20. 如何在年薪10万的上班族让自己第二年达到20万以上?

热门文章

  1. 白宫发布太空系统网络安全防护指令
  2. 黑客泄露50多万服务器、路由器和物联网设备的密码
  3. 新型 JhoneRAT 恶意软件攻击中东地区
  4. 安全组规则跨region导入导出功能介绍
  5. SpringCloud的EurekaClient : 客户端应用访问注册的微服务(无断路器场景)
  6. android Log工具框架,LogUtils让你摆脱TAG的魔爪
  7. Eagle个人博客系统
  8. 请还未提交实名的博客专家在8月4日前尽快提交您的实名信息
  9. 创建基于存储过程的数据块
  10. c语言数据页,c语言基础--数据类型(51页)-原创力文档