名前空間
変種
操作

wcsncpy, wcsncpy_s

From 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文字(終端のヌルワイド文字を含む)を、destが指すワイド文字配列にコピーします。
src全体がコピーされる前にcountに達した場合、結果のワイド文字配列はヌル終端されません。
srcから終端のヌルワイド文字をコピーした後、countに達していない場合、合計count文字が書き込まれるまで、追加のヌルワイド文字がdestに書き込まれます。
文字列が重なる場合、動作は未定義です。
2) (1)と同じですが、この関数は宛先配列にゼロを書き込み続けてcountまでパディングすることはせず、終端のヌル文字を書き込んだ後に停止します(ソースにヌル文字がない場合、dest[count]に1つ書き込んで停止します)。また、以下のエラーは実行時に検出され、現在インストールされている制約ハンドラ関数を呼び出します。
  • `src` または `dest` がヌルポインタである場合
  • destszまたはcountがゼロであるか、RSIZE_MAX/sizeof(wchar_t)よりも大きい
  • countdestsz以上であるにもかかわらず、destszwcsnlen_s(src, count)以下である場合、言い換えれば、切り捨てが発生する場合
  • ソース文字列と宛先文字列の間に重複が発生する場合
すべての境界チェック関数と同様に、`wcsncpy_s`は、実装によって`__STDC_LIB_EXT1__`が定義され、かつユーザーが``をインクルードする前に`__STDC_WANT_LIB_EXT1__`を整数定数`1`に定義している場合にのみ利用可能であることが保証されます。

目次

[編集] パラメータ

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

[編集] 戻り値

1) `dest` のコピーを返します。
2) 成功した場合はゼロを返し、エラーが発生した場合はゼロ以外の値を返します。また、エラー時にはdest[0]L'\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)
{
    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 wcsncpy関数 (p: 314)
  • K.3.9.2.1.2 wcsncpy_s関数 (p: 464)
  • C11標準 (ISO/IEC 9899:2011)
  • 7.29.4.2.2 wcsncpy関数 (p: 431)
  • K.3.9.2.1.2 wcsncpy_s関数 (p: 640-641)
  • C99標準 (ISO/IEC 9899:1999)
  • 7.24.4.2.2 wcsncpy関数 (p: 377)

[編集] 関連項目

(C95)(C11)
あるワイド文字列を別のワイド文字列にコピーする
(関数) [編集]
オーバーラップしていない2つの配列間で、指定された数のワイド文字をコピーする
(関数) [編集]
ある文字列から別の文字列に指定された文字数をコピーする
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)