命名空间
变体
操作

wcsncpy, wcsncpy_s

来自 cppreference.com
< c‎ | string‎ | wide
在头文件 <wchar.h> 中定义
(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 count );
(自 C99)
errno_t wcsncpy_s( wchar_t *restrict dest, rsize_t destsz,
                   const wchar_t *restrict src, rsize_t count);
(2) (自 C11)
1)src 指向的宽字符串中的最多 count 个字符(包括终止的 null 宽字符)复制到 dest 指向的宽字符数组中。
如果在复制整个字符串 src 之前达到了 count,则生成的宽字符数组将不会以 null 结尾。
如果在从 src 复制终止的 null 宽字符之后,没有达到 count,则会向 dest 写入额外的 null 宽字符,直到写入的总字符数达到 count
如果字符串重叠,则行为未定义。
2)(1) 相同,除了该函数不会继续向目标数组写入零来填充到 count,它会在写入终止的 null 字符后停止(如果源中没有 null,它会在 dest[count] 处写入一个 null 字符,然后停止)。此外,以下错误在运行时被检测到,并调用当前安装的 约束处理程序 函数
  • srcdest 是一个空指针
  • destszcount 为零或大于 RSIZE_MAX/sizeof(wchar_t)
  • count 大于或等于 destsz,但 destsz 小于或等于 wcsnlen_s(src, count),换句话说,会发生截断
  • 源字符串和目标字符串之间会发生重叠
与所有边界检查函数一样,只有在实现定义了 __STDC_LIB_EXT1__ 并且用户在包含 <wchar.h> 之前将 __STDC_WANT_LIB_EXT1__ 定义为整数常量 1 时,wcsncpy_s 才保证可用。

内容

[编辑] 参数

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

[编辑] 返回值

1) 返回 dest 的副本
2) 成功时返回零,错误时返回非零。此外,在发生错误时,会将 L'\0' 写入 dest[0](除非 dest 是一个空指针,或者 destsz 为零或大于 RSIZE_MAX/sizeof(wchar_t)),并且可能会用未指定的值覆盖目标数组的其余部分。

[编辑] 注释

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

虽然截断以适合目标缓冲区是一个安全风险,因此对于 wcsncpy_s 来说是运行时约束违反,但可以通过将 count 指定为目标数组大小减 1 来获得截断行为:它将复制前 count 个宽字符并附加 null 宽字符(如往常一样):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)
{
    const 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");
 
    const long dest_size = sizeof dest / sizeof *dest;
    for(wchar_t* p = dest; p-dest != dest_size; ++p) {
        *p ? printf("%lc ", *p)
           : printf("\\0 ");
    }
}

可能的输出

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

[编辑] 参考

  • C17 标准 (ISO/IEC 9899:2018)
  • 7.29.4.2.2 The wcsncpy function (p: 314)
  • K.3.9.2.1.2 The wcsncpy_s function (p: 464)
  • C11 标准 (ISO/IEC 9899:2011)
  • 7.29.4.2.2 The wcsncpy function (p: 431)
  • K.3.9.2.1.2 The wcsncpy_s function (p: 640-641)
  • C99 标准 (ISO/IEC 9899:1999)
  • 7.24.4.2.2 The wcsncpy function (p: 377)

[编辑] 另请参阅

(C95)(C11)
将一个宽字符串复制到另一个
(函数) [编辑]
在两个非重叠数组之间复制一定数量的宽字符
(函数) [编辑]
将一定数量的字符从一个字符串复制到另一个字符串
(函数) [编辑]
C++ 文档 用于 wcsncpy