本文内容,同样适用于款字符串(wchar_t)
C语言中,用以0结尾的char数组存储字符串,例如字符串 ”123”,C语言中表示为字节 0x31 0x32 0x33 0x00
std:string则用指针 char*和长度值来存储字符串,例如字符串“123”,std::string 的char*指针指向0x31 0x32 0x33,长度值为3
因为,std::string有个长度数值来表示字符串的长度,所以std::string可以存储含有多个0x00的字符串。
但同时这也带来一个新的问题:C风格字符串和std::string的判等。
1、使用strcmp库函数比较
char * CStr = "\x31\x32\x33"; // 123
std::string stdStr("\x31\x32\x33\x00",4);
很明显,CStr和stdStr不等。但是strcmp(CStr,stdStr.c_str())==0,相等
2、std::string的操作符==重载
上例中,stdStr == CStr 为假,不相等
因为,std::string重载了操作符== ,其行为是:CStr的长度strlen(CStr)、内容,与stdStr的长度和内容完全相同。
因为strlen(CStr)为3,而stdStr的长度为4,所以不相等
一个很典型的例子:
char *str1 = ""; //空字符串
std::sttring str2;
str2.assign(1,0);// 分配给str2一个字节0,这时,str2长度为1,但仍然是一个C风格的空字符串