概述:
StringCbCopyN 是用以替代与strncpy, StringCbCopyN 拷贝一个给定字节数目的源字符串到目标字符串。通过给定目标缓冲区的大小以确保StringCbCopyN不对目标
缓冲
区越界问,避免
缓冲区溢出等安全问题。
函数原型:
HRESULT StringCbCopyN( __out LPTSTR pszDest,// 目标缓冲区指针 __in size_t cbDest,//目标缓冲区大小 __in LPCTSTR pszSrc, __in size_t cbSrc );
参数:
-
pszDest
[out]
- LPTSTR
-
指向目标缓冲区,用于接收拷贝字符串。
cbDest
[in]
- size_t
-
目的缓存区的大小,字节为单位。它必足够大以便能接收拷贝字符串(pszSrc 与 sbsrc 中较小的那个 ),它包含了字符串的结束符'\0', 该值最大可取
STRSAFE_MAX_CCH * sizeof(TCHAR)
。
pszSrc
[in]
- LPCTSTR
-
指向源字符串的目标缓冲区,源字串必须包含结束符。
cbSrc
[in]
- size_t
-
源字符串到拷贝到目的字符串的字节数。
返回值:
HRESULT
与 strncpy 相对应,该函数返回一个HRESULT 值, 它是一个指针,强烈建议使用宏 SUCCEEDED and FAILED 测试该函数返回值。
S_OK:
源字符串非空,向目的字串拷贝中没有截断源字符串,且以字符串终止符结束。
STRSAFE_E_INVALID_PARAMETER:
目标缓冲区大小要么是0
,要么大于最大允许值(STRSAFE_MAX_CCH * sizeof(TCHAR))
STRSAFE_E_INSUFFICIENT_BUFFER :
目标缓存区不够大,字符串被截断
注意:
该函数提供了额外的代码适当地处理缓冲区。如果没有缓冲区处理,则会涉及许多安全问题,包括缓冲区溢出。
该函数总是以终止符结束,且确保目的缓冲区大小不为0。
StringCbCopyN 是一个通用的函数形式,针对ansi 与unicode 分别有StringCbCopyNA 与 StringCbCopyNA 版本。
虽然StringCbCopyN是strncpy是替代版,但它们是有区别的,当cbSrc 比 pszSrc 所包含的字节数目值大时,它不像strncpy函数那样会在源字符串拷贝
结束后通过用null 结束符填充剩下的空间。
StringCbCopyN无法保证源字串与目的字符串两者之间出现重叠情况下的拷贝行为。
pszSrc 与 pszDest 必须 为非空。
StringCbCopyNEx 函数用于返回拷贝后的指向目的字符串的指针。
int _tmain(int argc, _TCHAR* argv[])
{
char des[5] = {0};
char src[20] = {"hello world"};
int nLen = strlen(src);
strncpy(des,src, nLen);
printf("Called strncpy()..The des string is = %s \n",des);
StringCbCopyNA(des,5,src,nLen);
printf("Called StringCbCopyNA()..The des string is = %s \n",des);
system("pause");
return 0;
}