不安全的字符串函数 |
Strsafe函数 |
Safe CRT函数 (C运行库) |
strcpy, wcscpy, _tcscpy, _mbscpy, strcpy , lstrcpy, _tccpy, _mbccpy |
StringCchCopy StringCbCopy StringCchCopyEx StringCbCopyEx |
strcpy_s |
strcat, wcscat , _mbscat, strcat, lstrcat, , strcatbuff, strcatchain, _tccat, _mbccat |
StringCchCat StringCbCat StringCchCatEx StringCbCatEx |
strcat_s |
wnsprintf, wsprintf, sprintf, swprintf, _stprintf |
StringCchPrintf StringCbPrintf StringCchPrintfEx StringCbPrintfEx |
_snprintf_s _snwprintf_s |
目标缓冲区太小时,不发生截断 |
目标缓冲区太小时,会发生截断 |
不发生截断 |
★String Safe函数:微软提供的内联形式函数,可以当做API
(在strsafe.h文件中,注意要在包含其他文件之后,才包含该文件!)
★Safe CRT函数:C运行库
Str Safe函数的介绍(须含包strsafe.h文件)——目标缓冲区太小时,会发生截断。
(1)StringCchXXXX函数——其中的Cch表示字符的个数,可用_countof(pszDest)计算
①StringCchCopy——复制一个字符串到缓冲区,但要求提供目标缓冲区的长度,以确保写入数据不会超出缓冲区的末尾使用该函数替代以下函数:strcpy、wcscpy、_tcscpy、lstrcpy、StrCpy等函数。
参数 |
描述 |
LPTSTR pszDest |
缓冲区,用于接收拷贝过来的字符串 |
size_t cchDest |
①目标缓冲区的大小(字符个数)——_countof(pszDest) ②该值必须大于或等于 lstrlen(pszSrc) + 1(待拷贝字符串的字符+'\0') ③这个数不能超过 STRSAFE_MAX_CCH。 |
LPCTSTR pszSrc |
待拷贝的字符串 |
返回值 |
①S_OK:字符串正常拷贝 ②STRSAFE_E_INVALID_PARAMETER:cchDest 参数的值为 0或cchDest 参数的值大于 STRSAFE_MAX_CCH。 ③STRSAFE_E_INSUFFICIENT_BUFFER:因缓冲区空间不足导致失败;结果被截断,但仍然包含'\0'结尾;如果截断操作可以被接受,则不一定被看作是失败,即这时的返回值也可认为是可接受的。 |
②StringCchCat——将一个字符串拼接到另一个字符,使用该函数替代以下函数:strcat、 wcscat、_tcsat、lstrcat、StrCat和StrCatBuff等函数。
参数 |
描述 |
LPTSTR pszDest |
①目标缓冲区,同时包含第一个字符串 ②该缓冲区应该大于或等于(lstrlen(pszDest) +lstrlen(pszSrc) + 1)*sizeof(TCHAR) |
size_t cchDest |
①目标缓冲区的大小(字符个数)——_countof(pszDest) ②该缓冲区必须大于或等于lstrlen(pszDest) +lstrlen(pszSrc) + 1(两个字符串的字符总和+'\0') ③这个数不能超过 STRSAFE_MAX_CCH。 |
LPCTSTR pszSrc |
第2个字符串 |
返回值 |
①S_OK:字符串正常拼接 ②STRSAFE_E_INVALID_PARAMETER:cchDest 参数的值为 0或cchDest 参数的值大于 STRSAFE_MAX_CCH;目标缓冲区空间已满。 ③STRSAFE_E_INSUFFICIENT_BUFFER:因缓冲区空间不足导致失败;结果被截断,但仍然包含'\0'结尾;如果截断操作可以被接受,则不一定被看作是失败。 |
③StringCchLength——用于确定字符串是否超过了规定的长度,以字符为计算单位(不含\0),用来替换strlen、wcslen和_tcslen函数。
参数 |
描述 |
LPCTSTR psz |
指向待检查的字符串 |
size_t cchMax |
①psz 参数里最大允许的字符数量,包括'\0' ②这个数不能超过 STRSAFE_MAX_CCH。 |
size_t *pcch |
①psz 参数指向字符串的字符个数,不包括'\0',字符串长度返回这参数中。 ②这个值只有在 psz 指针不为 NULL,且函数成功时有效 |
返回值 |
①S_OK:psz 指向的字符串不为空,且字符串的长度(包括'\0')小于等于 cchMax ②STRSAFE_E_INVALID_PARAMETER:psz 指向空字符串;cchMax 的值大于STRSAFE_MAX_CCH;psz 指向的字符串的字符个数超过 cchMax。 |
④StringCchPrintf——把数据格式化写入到指定的缓冲区里,使用该函数替代以下函数:
Sprintf、swprintf、 _stprintf、wsprintf、wnsprintf、_snprintf、_snwprintf和 _sntprintf等函数
参数 |
描述 |
LPTSTR pszDest |
指定格式化数据将要写入的缓冲区 |
size_t cchDest |
①缓冲区大小,应该设置足够大,以容纳字符串和结束标记('\n') ②最大允许的字符数是 STRSAFE_MAX_CCH |
LPCTSTR pszFormat |
①格式化字符串,与 pirntf 的格式化字符串一致 ②这个值只有在 psz 指针不为 NULL,且函数成功时有效 |
... |
可变参数,参数的个数取决 pszFormat 参数 |
返回值 |
①S_OK:psz 表示有足够的空间将拷贝到 pszDest,没有发生截断 ②STRSAFE_E_INVALID_PARAMETER:cchDest 的值为 0 或大于 STRSAFE_MAX_CCH。 ③STRSAFE_E_INSUFFICIENT_BUFFER:由于缓冲区空间不足而导致的复制失败;结果被截断,当仍然包含'\0'结尾;如果截断操作可以被接受,则不一定被看作是失败。 |
(2)StringCcbXXXX函数:其中的Ccb表示目标缓冲区的字节数,可用sizeof(pszDest)求
(3)StringCchXXXXEx和StringCcbEx等扩展版本的函数,(见课本P22页)