Namespaces
Variants

wmemcpy, wmemcpy_s

From cppreference.net
< c ‎ | string ‎ | wide
ヘッダーで定義 <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) と同様ですが、以下のエラーが実行時に検出され、現在インストールされている constraint handler 関数を呼び出す点が異なります:
  • src または dest がnullポインタである場合
  • destsz または count RSIZE_MAX / sizeof ( wchar_t ) より大きい場合
  • count destsz より大きい場合(オーバーフローが発生する)
  • ソースとデスティネーションの配列間にオーバーラップが発生する場合
すべての境界チェック付き関数と同様に、 wmemcpy_s は、実装によって __STDC_LIB_EXT1__ が定義されており、かつユーザーが <wchar.h> をインクルードする前に __STDC_WANT_LIB_EXT1__ を整数定数 1 に定義している場合にのみ利用可能であることが保証されます。

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - C++関連の用語(Parameters、Return value、Notes、Example、References、See also)は原文のまま保持しました - HTMLタグ、属性、クラス名、IDはすべて変更せず保持しました - 数字の書式もそのまま維持しました

パラメータ

dest - コピー先のワイド文字配列へのポインタ
src - コピー元のワイド文字配列へのポインタ
count - コピーするワイド文字の数
destsz - 書き込むワイド文字の最大数(宛先バッファのサイズ)

戻り値

1) dest のコピーを返す
2) 成功時はゼロを返し、エラー時は非ゼロを返す。また、エラー時には、 dst 全体を( dst + dstsz まで、ただし含まず)nullワイド文字 L ' \0 ' で埋める( dest がnullの場合、または 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); // copy from1, along with its null terminator
    wmemcpy(to + sz1, from2, sz2); // append from2, along with its null terminator
    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 wmemcpy関数 (p: 431)
  • K.3.9.2.1.3 wmemcpy_s関数 (p: 641)
  • C99標準 (ISO/IEC 9899:1999):
  • 7.24.4.2.3 wmemcpy関数 (p: 377)

関連項目

指定された数のワイド文字を二つの配列間でコピーする(領域が重複している可能性あり)
(関数)
指定された数の文字をある文字列から別の文字列にコピーする
(関数)