wcsncpy, wcsncpy_s
ja.cppreference.net より
| ヘッダ <wchar.h>
|
||
wchar_t* wcsncpy( wchar_t* dest, const wchar_t* src, size_t count );
|
で定義 (1) | (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)
count が指すワイド文字列(終端のヌルワイド文字を含む)から、最大 src 文字を dest の指すワイド文字配列にコピーします。count に達する前に文字列 src 全体がコピーされた場合、結果のワイド文字配列はヌル終端されません。src から終端のヌルワイド文字をコピーした後も count に達していない場合は、合計 dest 文字が書き込まれるまで、追加のヌルワイド文字が count に書き込まれます。 文字列が重なっている場合の動作は未定義です。
2) (1) と同じですが、この関数は まで埋めるためにコピー先配列にゼロを書き込み続けることはなく、終端ヌル文字を書き込んだ後で停止します(ソースにヌルがない場合は
count に1つ書き込んで停止します)。また、以下のエラーが実行時に検出され、現在インストールされている dest[count] 制約ハンドラ 関数を呼び出します。
srcまたはdestがヌルポインタであるdestszまたはcountがゼロまたはRSIZE_MAX / sizeof(wchar_t)countより大きいdestszがdestsz以上であるがwcsnlen_s(src, count)が- 以下である、すなわち切り詰めが発生する
- ソース文字列とコピー先文字列の間で重なりが発生する
wcsncpy_s他の境界チェック付き関数と同様に、__STDC_LIB_EXT1__が実装で定義されており、かつユーザーが__STDC_WANT_LIB_EXT1__をインクルード前に整数定数1として定義している場合にのみ、<wchar.h> が利用可能であることが保証されます。
引数
| dest | - | コピー先のワイド文字配列へのポインタ |
| src | - | コピー元のワイド文字列へのポインタ |
| count | - | コピーするワイド文字の最大数 |
| destsz | - | コピー先バッファのサイズ |
戻り値
1)
dest のコピーを返します2)
L'\0' 成功時はゼロを返し、エラー時は非ゼロを返します。また、エラー時には dest[0] に dest を書き込み(destsz がヌルポインタであるか RSIZE_MAX / sizeof(wchar_t) がゼロまたは より大きい場合を除く)、コピー先配列の残りを未規定の値で上書きする可能性があります。
ノートcount一般的な使用法では、
はコピー先配列の要素数です。
wcsncpy_s については、コピー先バッファに収めるための切り詰めはセキュリティリスクでありランタイム制約違反となりますが、count をコピー先配列のサイズから1を引いた値に指定することで、切り詰め動作を実現することが可能です。この場合、最初の count ワイド文字がコピーされ、通常通りヌルワイド終端文字が追加されます。
size_t count = sizeof dst / sizeof *dst;
wcsncpy_s(dst, count, src, count - 1);
例
このコードを実行する
#include <locale.h>
#include <stdio.h>
#include <wchar.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
参考文献
- C23 規格 (ISO/IEC 9899:2024):
- 7.31.4.2.2 The wcsncpy function (p: 438)
- K.3.9.3.1.2 The wcsncpy_s function (p: 663-664)
- 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) |
一方のワイド文字列を他方にコピーする (関数) |
(C95)(C11) |
重なり合わない2つの配列間で一定数のワイド文字をコピーする (関数) |
(C11) |
一方の文字列から他方へ一定数の文字をコピーする (関数) |
C++ ドキュメント wcsncpy
| |