码迷,mamicode.com
首页 > 其他好文 > 详细

宽字符的坑

时间:2015-05-15 21:07:44      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:

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

 

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

 

宽字符的坑

标签:

原文地址:http://www.cnblogs.com/GlenWang/p/4506689.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!