先看看可能有问题或者有歧义的代码:
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会不会在末尾加上一个字符串结束标志'\0'呢?
使用新的安全字符串函数之后,上面的都不是问题了,关于安全字符串函数,技术细节还是很多的,但我们不用管那么多,我们只需要关心我们用得最多的几个就可以了。
旧函数 |
新函数(字符) |
新函数(字节) |
lstrlen |
StringCchLength |
StringCbLength |
lstrcpy |
StringCchCopy |
StringCbCopy |
lstrcat |
StringCchCat |
StringCbCat |
wsprintf |
StringCchPrintf |
StringCbPrintf |
你会发现,一个旧的函数对应了两个新的函数,理解这个并不难,因为新的函数大多需要你指定一个“最长长度”,那这个长度究竟指的是字符数目还是字节长度呢?如果指的是字符数目的话,那就用Cch系列的,否则就用Cb系列的。好我们改一下上面的代码:
TCHAR *p = TEXT("ABC中文");
size_t iLen;
//We want to get the character number
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 is "more than" now, it always ends with a '\0'
这样的字符拷贝也就不存在越界的问题了,并且能保证字符串总是能以'\0'结束。其它的嘛,读者就举一反三自己看看了,基本用用还是没问题的,如果有兴趣还可以直接看看这些字符串函数的代码,不简单的哦。
最后,别忘了使用的时候包含strsafe.h头文件。