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

#include 
#include 
#include 

using namespace std;

int main(){
    string s = "do";
    char c[] = "do";
    cout<< "Inition size is:" << s.size() <

C++ string 成员函数 length() size() 和 C语言 strlen() 的区别_第1张图片

 

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

#include 
#include 
#include 
using namespace std;
int main() {
    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;
    return 0;
}

 

结论

(1)当 string 中含有空字符’\0’,使用 strlen() 获取 string 的长度时会被截断,使用成员函数 length() 和 size() 可以返回 string 的真实长度。

毕竟strlen()是C语言中的函数

(2)cout 对 string 输出时,会过滤掉空字符,输出不会被截断。

(3)在构造或者拼接 string 时,建议同时指定 string 的长度

(4)sizeof()问题:

ofstream out("d:\\b.txt"); //打开或创建文本文件
const char* hello = "helloworld";
std::cout << hello << std::endl;
std::cout << sizeof(hello) << std::endl; //4
std::cout << sizeof("hello world") << std::endl; //12
out.write(hello, sizeof(hello));
out.close();

应该替代为

out.write(hello, strlen(hello);

对 sizeof 而言,因为缓冲区已经用已知字符串进行了初始化,其长度是固定的,所以 sizeof 在编译时计算缓冲区的长度。也正是由于在编译时计算,因此 sizeof 不能用来返回动态分配的内存空间的大小。

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

你可能感兴趣的:(c++,c语言,开发语言)