lstrcpynA 函数 (winbase.h)
将源字符串中的指定数量的字符复制到缓冲区中。
语法
LPSTR lstrcpynA(
[out] LPSTR lpString1,
[in] LPCSTR lpString2,
[in] int iMaxLength
);
参数
[out] lpString1
类型:LPTSTR
接收复制字符的目标缓冲区。 缓冲区必须足够大,以包含由 iMaxLength指定的 TCHAR 值的数量,包括终止 null 字符的空间。
[in] lpString2
类型:LPCTSTR
函数从中复制字符的源字符串。
[in] iMaxLength
类型:int
要从由 lpString2 指向的字符串复制的 TCHAR 值的数目 lpString1指向的缓冲区,包括终止 null 字符。
返回值
类型:LPTSTR
如果函数成功,则返回值为指向缓冲区的指针。 即使源字符串大于 iMaxLength 字符,该函数也能成功。
如果函数失败,则返回值 NULL,lpString1 可能不会以 null 结尾。
言论
lpString1 指向的缓冲区必须足够大,才能包含终止 null 字符,iMaxLength 指定的字符串长度值 包含终止 null 字符的空间。
如果源缓冲区和目标缓冲区重叠,则 lstrcpyn 函数具有未定义的行为。
安全警告
正确使用此函数可能会损害应用程序的安全性。 此函数使用结构化异常处理(SEH)捕获访问冲突和其他错误。 当此函数捕获 SEH 错误时,它将返回 NULL,而不终止字符串,并且不通知调用方错误。 调用方无法安全地假定空间不足是错误条件。如果由 lpString1 指向的缓冲区不够大,无法包含复制的字符串,则可能会出现缓冲区溢出。 复制整个字符串时,请注意,sizeof 返回字节数。
例如,如果 lpString1 指向声明为 TCHAR szString[100]
的缓冲区 szString1,则 sizeof(szString1)以字节为单位提供缓冲区的大小,而不是 WCHAR,这可能会导致函数 Unicode 版本的缓冲区溢出。
缓冲区溢出情况是应用程序中出现许多安全问题的原因,如果发生访问冲突,可能会对应用程序造成拒绝服务攻击。 在最坏的情况下,缓冲区溢出可能会允许攻击者将可执行代码注入进程,尤其是在 lpString1 是基于堆栈的缓冲区时。
使用 sizeof(szString1)/sizeof(szString1[0])
提供缓冲区的正确大小。
请考虑改用 StringCchCopy;使用 StringCchCopy(buffer, sizeof(buffer)/sizeof(buffer[0]), src);
,请注意 buffer
不能是指针,也不能使用 StringCchCopy(buffer, ARRAYSIZE(buffer), src);
,请注意,复制到指针时,调用方负责传入指向内存的大小(以字符为单位)。
在继续操作之前,请查看 安全注意事项:Windows 用户界面。
注意
winbase.h 标头将 lstrcpyn 定义为一个别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将中性编码别名与不中性编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows 2000 Professional [仅限桌面应用] |
支持的最低服务器 | Windows 2000 Server [仅限桌面应用] |
目标平台 | 窗户 |
标头 | winbase.h (包括 Windows.h) |
库 | Kernel32.lib |
DLL | Kernel32.dll |
另请参阅
概念
参考