C风格的字符串和std::string的比较

来源:互联网 发布:superjunior厂牌知乎 编辑:程序博客网 时间:2024/06/04 18:31

本文内容,同样适用于款字符串(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风格的空字符串

原创粉丝点击