宽字符的坑
今天老大让我自己写一个String类
而且还是用宽字符wchar_t进行初始化,大坑,深坑,非常坑啊。
首先,宽字符组成的字符串,len和size并不相等
String类要仿照其他语言,做成一个固定大小的“死字符串”
memcpy函数调用过程中,是传的void*,所以这时候就要小心,见如下代码:
void String::append(const cqWCHAR* str)
{
size_t len = cq_wcslen(str);
size_t totalLength = this->length + len;
size_t bufferSize = (totalLength + 1) << 1;
this->cstr = (cqWCHAR*)realloc((void*)this->cstr, bufferSize);
size_t offSet = this->length * 2;
memcpy((void*)(this->cstr + this->length), str, bufferSize - offSet);
this->length = totalLength;
}
指针的跳跃度是与len一致的(因为转化为void*之前,指针是带有类型的,所以指针加1,就向后两个字节),而拷贝的内存的大小却要与size一致
比较是否以某个字符串开头/结尾更有趣,代码如下
bool String::startsWithCaseIncensensitive(const cqWCHAR* str)
{
size_t len = cq_wcslen(str);
if (len > this->length)
return false;
return cq_wcsnicmp(this->cstr, str, len) == 0;
}
加粗部分是我们公司内部实现的类strnicmp函数,用来比较两个宽字符串是否相等,
一开始我调用的是cq_wcsicmp函数,结果,就没有结果了。。。。。能相等才怪。。。。
然后就是一开始0写成了TRUE,怎么测试就是不对,才想起来,两个字符串相等的时候,返回的是0,SB了。。。。
还有一个错误,就是startsWithCaseIncensensitive意思就是不区分大小写,一开始就意会错了,以为是区分大小写的。。。。。
后来为了不区分大小写,直接用了一句(if *str1 != *str2 && abs(*str1 - *str2) != 32) 你以为字符串中除了大小写字母,就没别的了吗,让我说你什么好。。。。。。
算了,写到这里吧,惨不忍睹了。。。。。。。。