Xi Xu's More Things

wmemcpy, wmemcpy_s

来自cppreference.com
< c‎ | string‎ | wide
 
 
 
空终止宽字符串
函数
字符操作
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C99)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
转换成数值格式
(C95)(C99)
(C95)(C99)
(C99)(C95)(C99)
(C99)(C99)
字符串操作
(C95)(C11)
(C95)(C11)
(C95)(C11)
(C95)(C11)
(C95)(C11)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)(C11)
数组操作
wmemcpywmemcpy_s
(C95)(C11)
(C95)(C11)
(C95)
(C95)
(C95)
 
在标头 <wchar.h> 定义
(1)
wchar_t* wmemcpy( wchar_t* dest, const wchar_t* src, size_t count );
(C95 起)
(C99 前)
wchar_t *wmemcpy(wchar_t *restrict dest, const wchar_t *restrict src,
                 size_t count );
(C99 起)
errno_t wmemcpy_s( wchar_t *restrict dest, rsize_t destsz,
                   const wchar_t *restrict src, rsize_t count );
(2) (C11 起)
1)src 所指向的宽字符数组准确复制 count 个相继的宽字符到 dest 所指向的宽字符数组。若对象重叠,则行为未定义。若 count 为零,则函数不做任何事。
2)(1) ,除了在运行时检测下列错误,并调用当前安装的约束处理函数:
  • srcdest 是空指针
  • destszcount 大于 RSIZE_MAX/sizeof(wchar_t)
  • count 大于 destsz (会发生溢出)
  • 源和目标数组间会发生重叠
同所有边界检查函数, wmemcpy_s 仅若实现定义了 __STDC_LIB_EXT1__ ,且用户在包含 wchar.h 前定义 __STDC_WANT_LIB_EXT1__ 为整数常量 1 才保证可用。

参数

dest - 指向复制目标宽字符数组的指针
src - 指向复制来源宽字符数组的指针
count - 要复制的宽字符数
destsz - 要写入的最大宽字符数(目标缓冲区的大小)

返回值

1) 返回 dest 的副本
2) 成功时返回零,错误时返回非零。在错误时,亦以空宽字符 L'\0' 填充整个 dst ,直到而不包含 dst+dstsz (除非 dest 为空或 destsz 大于 RSIZE_MAX/sizeof(wchar_t)

注意

此函数对字节字符串的类似版本是 strncpy ,而非 strcpy

此函数不考虑本地环境,而且不关心其所复制的 wchar_t 对象的值:亦复制空字符还有非法字符。

示例

#include <stdio.h>
#include <wchar.h>
#include <locale.h>
 
int main(void)
{
    wchar_t from1[] = L"नमस्ते";
    size_t sz1 = sizeof from1 / sizeof *from1;
    wchar_t from2[] = L"Բարև";
    size_t sz2 = sizeof from2 / sizeof *from2;
    wchar_t to[sz1 + sz2];
    wmemcpy(to, from1, sz1); // 复制 from1 ,沿着其空终止符
    wmemcpy(to + sz1, from2, sz2); // 后附 from2 ,沿着其空终止符
 
    setlocale(LC_ALL, "en_US.utf8");
    printf("Wide array contains: ");
    for(size_t n = 0; n < sizeof to / sizeof *to; ++n)
        if(to[n])
            printf("%lc", to[n]);
        else
            printf("\\0");
    printf("\n");
}

可能的输出:

Wide array contains: नमस्ते\0Բարև\0

引用

  • C11 标准(ISO/IEC 9899:2011):
  • 7.29.4.2.3 The wmemcpy function (第 431 页)
  • K.3.9.2.1.3 The wmemcpy_s function (第 641 页)
  • C99 标准(ISO/IEC 9899:1999):
  • 7.24.4.2.3 The wmemcpy function (第 377 页)

参阅

在两个可能重叠的数组间复制一定数量的宽字符
(函数)
从一个字符串复制一定数量的字符到另一个
(函数)