直接上代码段:

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()<<endl;
cout<<"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()):
strlen(strTest.c_str()):1
strTest:avh

结论:

结论: 
(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;

以上内容参考:链接


对于.length()和.size(),其实是没有区别的,是因为容器都含有.size()方法,但是对于string类来说,.length()更加直观,所以新加了这个函数,但是其实他俩相当于是同义词。