先看看可能有問題或者有歧義的代碼:
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頭文件。