Namespaces
Variants

wcsncat, wcsncat_s

From cppreference.net
< c ‎ | string ‎ | wide
ヘッダーで定義 <wchar.h>
(1)
wchar_t * wcsncat ( wchar_t * dest, const wchar_t * src, size_t count ) ;
(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 です)。
宛先配列が str dest の内容および終端ナルワイド文字に対して十分な大きさでない場合、動作は未定義です。
文字列が重なっている場合、動作は未定義です。
2) (1) と同様ですが、この関数は宛先配列の残りの部分(最後に書き込まれたワイド文字から destsz まで)を上書きする可能性があり、以下のエラーが実行時に検出され、現在インストールされている constraint handler 関数を呼び出す点が異なります:
  • src または dest がnullポインタ
  • destsz または count がゼロまたは RSIZE_MAX / sizeof ( wchar_t ) より大きい
  • dest の最初の destsz ワイド文字にnullワイド文字がない
  • 切り捨てが発生する場合: count または src の長さ(いずれか小さい方)が、 dest のnull終端文字と destsz の間の利用可能な領域を超える
  • ソース文字列と宛先文字列の間にオーバーラップが発生する
すべての境界チェック付き関数と同様に、 wcsncat_s は、実装によって __STDC_LIB_EXT1__ が定義されており、かつユーザーが <wchar.h> を含める前に __STDC_WANT_LIB_EXT1__ を整数定数 1 に定義している場合にのみ利用可能であることが保証されます。

目次

パラメータ

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

戻り値

1) dest のコピーを返す
2) 成功時はゼロを返し、エラー時は非ゼロを返します。また、エラー時には L ' \0 ' dest [ 0 ] に書き込みます(ただし dest がnullポインタの場合、または destsz がゼロまたは RSIZE_MAX / sizeof ( wchar_t ) より大きい場合は除く)。

注記

宛先バッファに収まるように切り詰めることはセキュリティリスクであるため、 wcsncat_s の実行時制約違反となりますが、 count を宛先配列のサイズから1を引いた値に指定することで、切り詰め動作を実現することが可能です。この場合、最初の count 個のワイド文字をコピーし、常通りナルターミネータを追加します: wcsncat_s ( dst, sizeof dst / sizeof * dst, src, ( sizeof dst / sizeof * dst ) - wcsnlen_s ( dst, sizeof dst / sizeof * dst ) - 1 ) ;

#include <wchar.h> 
#include <stdio.h>
#include <locale.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);
}

出力例:

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

参考文献

  • 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)
ワイド文字列を別のワイド文字列にコピーする
(関数)