放牧代码和思想
专注自然语言处理、机器学习算法
    愛しさ 優しさ すべて投げ出してもいい

strsafe.h 安全的字符串操作函数 新旧函数替换表

先看看可能有问题或者有歧义的代码:
TCHAR *p = TEXT("ABC中文");
INT iLen = lstrlen(p);lstrlen返回的到底是字符串的字符数目,还是字符串所占据的字节数呢?再看:
TCHAR *p = TEXT("more than 10 characters.");
TCHAR szBuff[10];
lstrcpy(szBuff, p);明显要复制到szBuff的字符串比szBuff本身要长,那会导致什么问题呢?如果要复制的字符串的长度正好就是10,那szBuff会不会在末尾加上一个字符串结束标志’’呢?很明显不会,所以这样的代码迟早会惹出大麻烦。

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

旧函数新函数(字符)新函数(字节)lstrlenStringCchLengthStringCbLengthlstrcpyStringCchCopyStringCbCopylstrcatStringCchCatStringCbCatwsprintfStringCchPrintfStringCbPrintf
你会发现,一个旧的函数对应了两个新的函数,理解这个并不难,因为新的函数大多需要你指定一个“最长长度”,那这个长度究竟指的是字符数目还是字节长度呢?如果指的是字符数目的话,那就用Cch系列的,否则就用Cb系列的。好我们改一下上面的代码:

TCHAR *p = TEXT("ABC中文");
size_t iLen;
//获取字符个数

StringCchLength(p, STRSAFE_MAX_CCH, &iLen);

这样就比较好地避免了歧义。
#define BUFFER_SIZE 10
TCHAR *p = TEXT("more than 10 characters.");
TCHAR szBuff[BUFFER_SIZE];
StringCchCopy(szBuff, BUFFER_SIZE, p);
//szBuff 缓冲区比 p 小,但拷贝后它的结尾还是’’,所以这段代码是安全的这样的字符拷贝也就不存在越界的问题了,并且能保证字符串总是能以’’结束。其它的嘛,读者就举一反三自己看看了,基本用用还是没问题的,如果有兴趣还可以直接看看这些字符串函数的代码,不简单的哦。
同时,还要注意不要乱用sizeof,比如错误代码:WCHAR szTargetPath[MAX_PATH] = L"";
 StringCchCopy(szTargetPath, sizeof(szTargetPath), file);

正确代码:
 StringCchCopy(szTargetPath, MAX_PATH, file);

最后,别忘了使用的时候包含strsafe.h头文件。

知识共享许可协议 知识共享署名-非商业性使用-相同方式共享码农场 » strsafe.h 安全的字符串操作函数 新旧函数替换表

评论 欢迎留言

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

我的作品

HanLP自然语言处理包《自然语言处理入门》