Namespaces
Variants

wcsncat, wcsncat_s

ja.cppreference.net より
 
 
 
 
ヘッダで定義 <wchar.h>
wchar_t* wcsncat( wchar_t* dest, const wchar_t* src, size_t count );
(1) (C95から)
(C99まで)
wchar_t* wcsncat( wchar_t* restrict dest,
                  const wchar_t* restrict src, size_t count );
(C99から)
errno_t wcsncat_s( wchar_t* restrict dest, rsize_t destsz,
                   const wchar_t* restrict src, rsize_t count );
(2) (C11から)
1) 最大でも count 個のワイド文字を、src が指すワイド文字列から (ヌル終端文字がコピーされたら停止する) コピーし、dest が指す文字列の末尾に追加する。ワイド文字 src[0] が dest の末尾のヌル終端文字を置き換える。常に最後にヌル終端文字が追加される (したがって、この関数が書き込む可能性のあるワイド文字の最大数は count + 1 である)。
コピー先配列が src と dest の内容および終端のヌルワイド文字を格納するのに十分な大きさでない場合、動作は未定義である。
文字列が重なっている場合、動作は未定義である。
2) (1) と同じだが、この関数はコピー先配列の残り部分 (最後に書き込まれたワイド文字から destsz まで) を上書きする可能性があることと、以下のエラーが実行時に検出され、現在インストールされている 制約ハンドラ 関数を呼び出す点が異なる:
  • srcまたは dest がヌルポインタである
  • destszまたは count が 0 か RSIZE_MAX / sizeof(wchar_t)
  • より大きい最初の destsz 個のワイド文字の中にヌルワイド文字が存在しないdest
  • 切り詰めが発生する: count または src の長さのうち小さい方が、dest のヌル終端文字と destsz の間の利用可能な空間を超えている。
  • コピー元とコピー先の文字列の間で重なりが発生する
すべての境界チェック関数と同様に、wcsncat_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) よりも大きい場合を除く)。

注記

宛先バッファに収まるように切り詰めることはセキュリティリスクであり、そのためwcsncat_sでは実行時制約違反となりますが、countを宛先配列のサイズから1を引いた値に指定することで、切り詰め動作を得ることが可能です。その場合、最初のcount個のワイド文字をコピーし、いつも通りナル終端文字を追加します:

size_t count = sizeof dst / sizeof *dst;
wcsncat_s(dst, count, src, count - wcsnlen_s(dst, count) - 1);

例

#include <locale.h>
#include <stdio.h>
#include <wchar.h>
 
int main(void)
{
    wchar_t str[50] = L"Земля, прощай.";
    wcsncat(str, L" ", 1);
    wcsncat(str, L"В добрый путь.", 8); // only append the first 8 wide chars
    setlocale(LC_ALL, "en_US.utf8");
    printf("%ls", str);
}

出力例:

Земля, прощай. В добрый

参考文献

  • C23規格 (ISO/IEC 9899:2024):
  • 7.31.4.3.2 wcsncat関数 (p: 439)
  • K.3.9.3.2.2 wcsncat_s関数 (p: 666)
  • C17規格 (ISO/IEC 9899:2018):
  • 7.29.4.3.2 wcsncat関数 (p: 315)
  • K.3.9.2.2.2 wcsncat_s関数 (p: 466-467)
  • C11規格 (ISO/IEC 9899:2011):
  • 7.29.4.3.2 wcsncat関数 (p: 432-433)
  • K.3.9.2.2.2 wcsncat_s関数 (p: 643-644)
  • C99規格 (ISO/IEC 9899:1999):
  • 7.24.4.3.2 wcsncat関数 (p: 378-379)

関連項目

(C95) (C11)
ワイド文字列を別のワイド文字列に追加する
(関数)
二つの文字列の特定の文字数を連結する
(関数)
(C95) (C11)
ワイド文字列を別のワイド文字列にコピーする
(関数)