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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值