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


C++ string 成员函数 length() 等同于 size(),但是和 C 库函数 strlen() 有着本质区别,使用时切勿混淆。

1.函数申明

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

// 返回 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[1] 为 0
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;

参考文献

C++ reference

  • 45
    点赞
  • 136
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值