C

wcsncpy

wcsncpy, wcsncpy_s

在头文件中定义
(1)
wchar_t * wcsncpy(wchar_t * dest,const wchar_t * src,size_t count);(自C95以来)(直到C99)
wchar_t * wcsncpy(wchar_t * restrict dest,const wchar_t * restrict src,size_t n);(自C99以来)
errno_t wcsncpy_s(wchar_t * restrict dest,rsize_t destsz,const wchar_t * restrict src,rsize_t n);(2)(自C11以来)

1)count将由src(包括终止空宽字符)指向的宽字符串中的大多数字符复制到指向的宽字符数组dest

如果count在整个字符串src被复制之前达到,则生成的宽字符数组不是以空字符结尾的。

如果在复制了终止空宽字符后srccount未写入,则会写入更多空宽字符,dest直到写入count字符总数为止。

如果字符串重叠,则行为不确定。

2)与(1)相同,除了该函数不会继续将零写入目标数组以填充为止count,它将在写入终止空字符后停止(如果源中没有空值,则将其写入dest[count]并且然后写入停止)。此外,在运行时检测到以下错误并调用当前安装的约束处理函数:

  • src或者dest是空指针

作为所有边界检查函数,wcsncpy_s只有在被__STDC_LIB_EXT1__实现定义__STDC_WANT_LIB_EXT1__并且1在包含之前用户定义为整数常量时才能保证可用wchar.h

参数

dest-指向要复制到的宽字符数组的指针
src-指向要从中复制的宽字符串
count-要复制的最大宽字符数
destsz-目标缓冲区的大小

返回值

1)返回一份副本 dest

2)在成功时返回零,错误时返回非零值。此外,在错误,写入L'\0'dest[0](除非dest是空指针或destsz为零或大于RSIZE_MAX/sizeof(wchar_t)),并且可以与揍未指定的值的目标阵列的其余部分。

注意

在典型用法中,count是目标数组中的元素数量。

尽管适合目标缓冲区的截断存在安全风险并因此违反了运行时间约束wcsncpy_s,但可以通过指定count等于目标数组的大小减1 来获得截断行为:它将复制第一个count宽字符并追加一如既往的广泛的终结者:wcsncpy_s(dst, sizeof dst / sizeof *dst, src, (sizeof dst / sizeof *dst)-1

示例

#include <stdio.h> #include <wchar.h> #include <locale.h> int main(void) { wchar_t src[] = L"わゐ"; wchar_t dest[6] = {L'あ', L'い', L'う', L'え', L'お'}; wcsncpy(dest, src, 4 // this will copy わゐ and repeat L'\0' two times puts("The contents of dest are: " setlocale(LC_ALL, "en_US.utf8" for(wchar_t* p = dest; p-dest < sizeof dest / sizeof *dest; ++p) { if(*p) printf("%lc ", *p else printf("\\0 " } }

可能的输出:

The contents of dest are: わ ゐ \0 \0 お \0

参考

  • C11标准(ISO/IEC 9899:2011):

另请参阅

wcscpywcscpy_s(C95)(C11)将一个宽字符串复制到另一个(函数)
wmemcpywmemcpy_s(C95)(C11)在两个非重叠数组之间复制一定数量的宽字符(函数)
strncpystrncpy_s(C11)将一定数量的字符从一个字符串复制到另一个字符串(函数)

| C ++文档wcsncpy |