宽字符的坑

今天老大让我自己写一个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) 你以为字符串中除了大小写字母,就没别的了吗,让我说你什么好。。。。。。

 

算了,写到这里吧,惨不忍睹了。。。。。。。。

 

posted @ 2015-05-15 19:08  GlenWang  阅读(731)  评论(0编辑  收藏  举报