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 指向的字符串复制到 lpString1 指向的缓冲区中的 TCHAR 值的数目,包括终止 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 [仅限桌面应用] |
目标平台 | Windows |
标头 | winbase.h (包括 Windows.h) |
Library | Kernel32.lib |
DLL | Kernel32.dll |
另请参阅
概念性
引用