strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l
将一个字符串字符到另一个。这些功能的更安全版本可用;请参见 strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l。
重要事项 |
---|
_mbsncpy 和 _mbsncpy_l 不能在 Windows 运行时执行的应用程序。有关更多信息,请参见 CRT 函数不支持与 /ZW。 |
char *strncpy(
char *strDest,
const char *strSource,
size_t count
);
char *_strncpy_l(
char *strDest,
const char *strSource,
size_t count,
locale_t locale
);
wchar_t *wcsncpy(
wchar_t *strDest,
const wchar_t *strSource,
size_t count
);
wchar_t *_wcsncpy_l(
wchar_t *strDest,
const wchar_t *strSource,
size_t count,
locale_t locale
);
unsigned char *_mbsncpy(
unsigned char *strDest,
const unsigned char *strSource,
size_t count
);
unsigned char *_mbsncpy_l(
unsigned char *strDest,
const unsigned char *strSource,
size_t count,
_locale_t locale
);
template <size_t size>
char *strncpy(
char (&strDest)[size],
const char *strSource,
size_t count
); // C++ only
template <size_t size>
char *_strncpy_l(
char (&strDest)[size],
const char *strSource,
size_t count,
locale_t locale
); // C++ only
template <size_t size>
wchar_t *wcsncpy(
wchar_t (&strDest)[size],
const wchar_t *strSource,
size_t count
); // C++ only
template <size_t size>
wchar_t *_wcsncpy_l(
wchar_t (&strDest)[size],
const wchar_t *strSource,
size_t count,
locale_t locale
); // C++ only
template <size_t size>
unsigned char *_mbsncpy(
unsigned char (&strDest)[size],
const unsigned char *strSource,
size_t count
); // C++ only
template <size_t size>
unsigned char *_mbsncpy_l(
unsigned char (&strDest)[size],
const unsigned char *strSource,
size_t count,
_locale_t locale
); // C++ only
参数
strDest
目标字符串。strSource
源字符串。count
要复制的字符数。locale
使用的区域设置。
返回值
返回 strDest。没有任何返回值保留指示错误。
备注
strncpy 功能复制 strSource 初始 count 字符。strDest 并返回 strDest。如果 count 小于或等于 strSource的长度,null 字符不会自动追加到了复制的字符串。如果 count 比 strSource的长度时,目标字符串填充 null 字符的长度 count。如果源页和目标字符串重叠,strncpy 行为不确定。
安全说明 |
---|
strncpy 不检查在 strDest足够的空间;这使它成为个可能的原因缓冲区溢出。count 参数限制复制的字符数;它不是在 strDest范围的限制。请参见下面的示例。有关更多信息,请参见 避免缓冲区溢出。 |
如果 strDest 或 strSource 是 NULL 指针,或者,如果 count 小于或等于零,无效参数调用处理程序,如 参数验证所述。如果执行允许继续,这些函数返回 -1 并将 errno 到 EINVAL
wcsncpy 和 _mbsncpy 是 strncpy的宽字符和多字节字符版本。参数和返回 wcsncpy 的值,并 _mbsncpy 相应地改变。这六个功能否则具有相同的行为。
这些功能的版本与 _l 后缀的相同,只不过它们为其与区域设置相关的行为使用区域设置而不是当前区域设置。有关更多信息,请参见区域设置。
在 C++ 中,这些函数的调用的模板超负载越 + 新,保证这些函数副本。有关更多信息,请参见安全模板重载。
一般文本例程映射
TCHAR.H 实例 |
未定义的_UNICODE & _MBCS |
定义的_MBCS |
定义的_UNICODE |
---|---|---|---|
_tcsncpy |
strncpy |
_mbsnbcpy |
wcsncpy |
_tcsncpy_l |
_strncpy_l |
_mbsnbcpy_l |
_wcsncpy_l |
说明 |
---|
_strncpy_l 和 _wcsncpy_l 没有区域设置依赖项;对 _tcsncpy_l 提供并且不应直接调用。 |
要求
实例 |
必需的标头 |
---|---|
strncpy |
<string.h> |
wcsncpy |
<string.h> 或 <wchar.h> |
_mbsncpy, _mbsncpy_l |
<mbstring.h> |
有关其他平台兼容性信息,请参见 兼容性。
示例
下面的示例演示如何使用 strncpy,以及如何对其误用导致程序缺陷,并且安全问题。编译器生成每个警告调用 strncpy 类似于 crt_strncpy_x86.c(15) : warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."
// crt_strncpy_x86.c
// Use this command in an x86 developer command prompt to compile:
// cl /TC /W3 crt_strncpy_x86.c
#include <stdio.h>
#include <string.h>
int main() {
char t[20];
char s[20];
char *p = 0, *q = 0;
strcpy_s(s, sizeof(s), "AA BB CC");
// Note: strncpy is deprecated; consider using strncpy_s instead
strncpy(s, "aa", 2); // "aa BB CC" C4996
strncpy(s + 3, "bb", 2); // "aa bb CC" C4996
strncpy(s, "ZZ", 3); // "ZZ", C4996
// count greater than strSource, null added
printf("%s\n", s);
strcpy_s(s, sizeof(s), "AA BB CC");
p = strstr(s, "BB");
q = strstr(s, "CC");
strncpy(s, "aa", p - s - 1); // "aa BB CC" C4996
strncpy(p, "bb", q - p - 1); // "aa bb CC" C4996
strncpy(q, "cc", q - s); // "aa bb cc" C4996
strncpy(q, "dd", strlen(q)); // "aa bb dd" C4996
printf("%s\n", s);
// some problems with strncpy
strcpy_s(s, sizeof(s), "test");
strncpy(t, "this is a very long string", 20 ); // C4996
// Danger: at this point, t has no terminating null,
// so the printf continues until it runs into one.
// In this case, it will print "this is a very long test"
printf("%s\n", t);
strcpy_s(t, sizeof(t), "dogs like cats");
printf("%s\n", t);
strncpy(t + 10, "to chase cars.", 14); // C4996
printf("%s\n", t);
// strncpy has caused a buffer overrun and corrupted string s
printf("Buffer overrun: s = '%s' (should be 'test')\n", s);
// Since the stack grows from higher to lower addresses, buffer
// overruns can corrupt function return addresses on the stack,
// which can be exploited to run arbitrary code.
}
Output
自动变量和错误检测和代码的保护级别格式可能随已更改的编译器设置而异。此示例可能具有不同的结果,在生成在其他生成环境或使用其他编译器选项。
.NET Framework 等效项
请参见
参考
strncat, _strncat_l, wcsncat, wcsncat_l, _mbsncat _mbsncat_l
strncmp, wcsncmp, _mbsncmp, _mbsncmp_l
_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l
strrchr, wcsrchr, _mbsrchr, _mbsrchr_l
_strset, _strset_l, _wcsset, _wcsset_l, _mbsset, _mbsset_l
strspn, wcsspn, _mbsspn, _mbsspn_l
strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l