Jiang's C++ Space

创作,也是一种学习的过程。

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
先看看可能有问题或者有歧义的代码:
TCHAR *= TEXT("ABC中文");
INT iLen 
= lstrlen(p);
lstrlen返回的到底是字符串的字符数目,还是字符串所占据的字节数呢?再看:
TCHAR *= TEXT("more than 10 characters.");
TCHAR szBuff[
10];
lstrcpy(szBuff, p);
明显要复制到szBuff的字符串比szBuff本身要长,那会导致什么问题呢?如果要复制的字符串的长度正好就是10,那szBuff会不会在末尾加上一个字符串结束标志'\0'呢?

使用新的安全字符串函数之后,上面的都不是问题了,关于安全字符串函数,技术细节还是很多的,但我们不用管那么多,我们只需要关心我们用得最多的几个就可以了。

旧函数 新函数(字符) 新函数(字节)
lstrlen StringCchLength StringCbLength
lstrcpy StringCchCopy StringCbCopy
lstrcat StringCchCat StringCbCat
wsprintf StringCchPrintf StringCbPrintf

你会发现,一个旧的函数对应了两个新的函数,理解这个并不难,因为新的函数大多需要你指定一个“最长长度”,那这个长度究竟指的是字符数目还是字节长度呢?如果指的是字符数目的话,那就用Cch系列的,否则就用Cb系列的。好我们改一下上面的代码:
TCHAR *= TEXT("ABC中文");
size_t iLen;
//We want to get the character number
StringCchLength(p, STRSAFE_MAX_CCH, &iLen);
这样就比较好地避免了歧义。
#define BUFFER_SIZE 10
TCHAR 
*= TEXT("more than 10 characters.");
TCHAR szBuff[BUFFER_SIZE];
StringCchCopy(szBuff, BUFFER_SIZE, p);
//szBuff is "more than" now, it always ends with a '\0'
这样的字符拷贝也就不存在越界的问题了,并且能保证字符串总是能以'\0'结束。其它的嘛,读者就举一反三自己看看了,基本用用还是没问题的,如果有兴趣还可以直接看看这些字符串函数的代码,不简单的哦。

最后,别忘了使用的时候包含strsafe.h头文件。
posted on 2010-08-10 13:12 Jiang Guogang 阅读(921) 评论(0)  编辑 收藏 引用 所属分类: Windows Programming

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理