先看看可能有問題或者有歧義的代碼:
TCHAR *p = TEXT("ABC中文");
INT iLen = lstrlen(p);
lstrlen返回的到底是字符串的字符數(shù)目,還是字符串所占據(jù)的字節(jié)數(shù)呢?再看:
TCHAR *p = TEXT("more than 10 characters.");
TCHAR szBuff[10];
lstrcpy(szBuff, p);
明顯要復(fù)制到szBuff的字符串比szBuff本身要長,那會導(dǎo)致什么問題呢?如果要復(fù)制的字符串的長度正好就是10,那szBuff會不會在末尾加上一個(gè)字符串結(jié)束標(biāo)志'\0'呢?
使用新的安全字符串函數(shù)之后,上面的都不是問題了,關(guān)于安全字符串函數(shù),技術(shù)細(xì)節(jié)還是很多的,但我們不用管那么多,我們只需要關(guān)心我們用得最多的幾個(gè)就可以了。
舊函數(shù) |
新函數(shù)(字符) |
新函數(shù)(字節(jié)) |
lstrlen |
StringCchLength |
StringCbLength |
lstrcpy |
StringCchCopy |
StringCbCopy |
lstrcat |
StringCchCat |
StringCbCat |
wsprintf |
StringCchPrintf |
StringCbPrintf |
你會發(fā)現(xiàn),一個(gè)舊的函數(shù)對應(yīng)了兩個(gè)新的函數(shù),理解這個(gè)并不難,因?yàn)樾碌暮瘮?shù)大多需要你指定一個(gè)“最長長度”,那這個(gè)長度究竟指的是字符數(shù)目還是字節(jié)長度呢?如果指的是字符數(shù)目的話,那就用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'結(jié)束。其它的嘛,讀者就舉一反三自己看看了,基本用用還是沒問題的,如果有興趣還可以直接看看這些字符串函數(shù)的代碼,不簡單的哦。
最后,別忘了使用的時(shí)候包含strsafe.h頭文件。