关于用cout输出string,遇到'\0'的处理问题

在string类型变量接收的常量字符串中如果有'\0',.length()函数和用cout就会以第一个'\0'作为字符串的结尾。

为什么将string变量的一个元素改为'\0'后,string变量的.length()函数和用cout输出不会受到'\0'的干扰?

代码如下

    string str1 = "hello";
    string str2 = "he\0llo";

    cout << "length of str1:" << str1.length() << "  str1:" << str1 << endl;
    cout << "length of str2:" << str2.length() << "  str2:" << str2 << endl;

    cout << endl;
    str1[2] = '\0';
    cout << "length of str1:" << str1.length() << "  str1:" << str1 << endl;

运行结果:

图片说明

常量字符串是c风格的

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