wmemmove, wmemmove_s

来自cppreference.com
< c‎ | string‎ | wide
定义于头文件 <wchar.h>
wchar_t* wmemmove( wchar_t* dest, const wchar_t* src, size_t count );
(1) (C95 起)
errno_t wmemmove_s( wchar_t *dest, rsize_t destsz,
                    const wchar_t *src, rsize_t count);
(2) (C11 起)
1) 准确地从 src 所指向的宽字符数组复制 count 个相继的宽字符到 dest 所指向的宽字符数组。若 count 为零,则函数不做任何事。数组可以重叠:如同复制宽字符到临时宽字符数组,再从临时数组到 dest 一般发生复制。
2)(1) ,除了在运行时检测下列错误,并调用当前安装的制约处理函数:
  • srcdest 为空指针
  • destszcount 大于 RSIZE_MAX/sizeof(wchar_t)
  • count 大于 destsz (会出现溢出)
同所有边界检查函数, wmemmove_s 仅若实现定义了 __STDC_LIB_EXT1__ ,且用户在包含 wchar.h 前定义 __STDC_WANT_LIB_EXT1__ 为整数常量 1 才保证可用。

参数

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

返回值

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

注意

此函数不考虑本地环境,并且不注意其所复制的 wchar_t 对象的值:亦会复制空字符和非法字符。

示例

#include <stdio.h>
#include <wchar.h>
#include <locale.h>
 
int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
 
    wchar_t str[] = L"αβγδεζηθικλμνξοπρστυφχψω";
    printf("%ls\n", str);
    wmemmove(str+4, str+3, 3); // 从 [δεζ] 复制到 [εζη]
    printf("%ls\n", str);
}

输出:

αβγδεζηθικλμνξοπρστυφχψω
αβγδδεζθικλμνξοπρστυφχψω

引用

  • C11 standard (ISO/IEC 9899:2011):
  • 7.29.4.2.4 The wmemmove function (p: 432)
  • K.3.9.2.1.4 The wmemmove_s function (p: 642)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.24.4.2.4 The wmemmove function (p: 378)

参阅

将一个缓冲区移动到另一个
(函数)
在两个不重叠的数组间复制一定数量的宽字符
(函数)