名前空間
変種
操作

wcstombs, wcstombs_s

From cppreference.com
< c‎ | string‎ | multibyte
ヘッダー <stdlib.h> で定義
(1)
size_t wcstombs( char          *dst, const wchar_t          *src, size_t len );
(C99まで)
size_t wcstombs( char *restrict dst, const wchar_t *restrict src, size_t len );
(C99以降)
errno_t wcstombs_s( size_t *restrict retval, char *restrict dst, rsize_t dstsz,
                    const wchar_t *restrict src, rsize_t len );
(2) (C11 以降)
1) src が指す配列のワイド文字シーケンスを、初期シフト状態のナローマルチバイト表現に変換します。変換された文字は、dst が指す char 配列の連続する要素に格納されます。宛先配列には len バイトまでしか書き込まれません。
各文字は wctomb の呼び出しのように変換されますが、wctomb の変換状態は影響を受けません。変換は以下の場合に停止します。
* ヌル文字 L'\0' が変換されて格納された場合。この場合、格納されるバイトは(必要であれば)アンシフトシーケンスに続いて '\0' です。
* 現在のCロケールで有効な文字に対応しない wchar_t が見つかった場合。
* 次に格納されるマルチバイト文字が len を超える場合。
srcdst が重複する場合、動作は未定義です。
2) 以下を除いて (1) と同じです。
* 変換は wcrtomb のように行われます。 wctomb ではありません。
* 関数は結果を出力パラメータ retval として返します。
* 変換がヌル文字を書き込まずに停止した場合、関数は dst の次のバイトに '\0' を格納します。これは dst[len] または dst[dstsz] のいずれか早い方になります(つまり、最大 len+1 / dstsz+1 バイトが書き込まれる可能性があります)。この場合、終端ヌルの前にアンシフトシーケンスが書き込まれないことがあります。
* dst がヌルポインタの場合、生成されるバイト数が *retval に格納されます。
* 関数は、終端ヌルから dstsz まで宛先配列を破壊します。
* srcdst が重複する場合、動作は未定義です。
* 実行時に以下のエラーが検出され、現在インストールされている 制約ハンドラ関数が呼び出されます。
  • retval または src がヌルポインタである。
  • dstsz または lenRSIZE_MAX より大きい(dst がヌルでない場合)。
  • dstsz がゼロでない(dst がヌルでない場合)。
  • lendstsz より大きく、かつ dstsz に達する時点で src 配列でヌルまたはエンコーディングエラーに遭遇しない場合(dst がヌルでない場合)。
すべての境界チェック付き関数と同様に、wcstombs_s は、実装によって __STDC_LIB_EXT1__ が定義されており、ユーザーが <stdlib.h> をインクルードする前に __STDC_WANT_LIB_EXT1__ を整数定数 1 として定義した場合にのみ、使用が保証されます。

目次

[編集] 注記

ほとんどの実装では、wcstombs は文字列を処理する際に、mbstate_t 型のグローバル静的オブジェクトを更新するため、2つのスレッドから同時に呼び出すことはできません。このような場合は、wcsrtombs または wcstombs_s を使用する必要があります。

POSIX は一般的な拡張機能を指定しています。dst がヌルポインタの場合、この関数は、変換された場合に dst に書き込まれるバイト数を返します。同様の動作は wcsrtombs および wcstombs_s の標準です。

[編集] パラメータ

dst - マルチバイト文字が格納される狭い文字配列へのポインタ
src - 変換するヌル終端ワイド文字列の最初の要素へのポインタ
len - dst が指す配列で利用可能なバイト数。
dstsz - 書き込まれる最大バイト数(dst 配列のサイズ)
retval - 結果が格納される size_t オブジェクトへのポインタ

[編集] 戻り値

1) 成功した場合、dst が指す文字配列に書き込まれたバイト数(シフトシーケンスを含むが、終端の '\0' を除く)を返します。変換エラー(無効なワイド文字が見つかった場合)が発生した場合、(size_t)-1 を返します。
2) 成功した場合はゼロを返します(この場合、終端ゼロを除いて dst に書き込まれた、または書き込まれるバイト数が *retval に格納されます)。エラーの場合はゼロ以外を返します。実行時制約違反の場合、(size_t)-1*retval に格納します(retval がヌルでない場合)。また、dst[0]'\0' に設定します(dst がヌルでない場合、または dstmax がゼロまたは RSIZE_MAX より大きい場合を除く)。

[編集]

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
 
int main(void)
{
    // 4 wide characters
    const wchar_t src[] = L"z\u00df\u6c34\U0001f34c";
    // they occupy 10 bytes in UTF-8
    char dst[11];
 
    setlocale(LC_ALL, "en_US.utf8");
    printf("wide-character string: '%ls'\n",src);
    for (size_t ndx=0; ndx < sizeof src/sizeof src[0]; ++ndx)
        printf("   src[%2zu] = %#8x\n", ndx, src[ndx]);
 
    int rtn_val = wcstombs(dst, src, sizeof dst);
    printf("rtn_val = %d\n", rtn_val);
    if (rtn_val > 0)
        printf("multibyte string:  '%s'\n",dst);
    for (size_t ndx=0; ndx<sizeof dst; ++ndx)
        printf("   dst[%2zu] = %#2x\n", ndx, (unsigned char)dst[ndx]);
}

出力

wide-character string: 'zß水🍌'
   src[ 0] =     0x7a
   src[ 1] =     0xdf
   src[ 2] =   0x6c34
   src[ 3] =  0x1f34c
   src[ 4] =        0
rtn_val = 10
multibyte string:  'zß水🍌'
   dst[ 0] = 0x7a
   dst[ 1] = 0xc3
   dst[ 2] = 0x9f
   dst[ 3] = 0xe6
   dst[ 4] = 0xb0
   dst[ 5] = 0xb4
   dst[ 6] = 0xf0
   dst[ 7] = 0x9f
   dst[ 8] = 0x8d
   dst[ 9] = 0x8c
   dst[10] =  0

[編集] 参照

  • C11標準 (ISO/IEC 9899:2011)
  • 7.22.8.2 The wcstombs function (p: 360)
  • K.3.6.5.2 The wcstombs_s function (p: 612-614)
  • C99標準 (ISO/IEC 9899:1999)
  • 7.20.8.2 The wcstombs function (p: 324)
  • C89/C90標準 (ISO/IEC 9899:1990)
  • 4.10.8.2 The wcstombs function

[編集] 関連項目

与えられた状態で、ワイド文字列をナローマルチバイト文字列に変換する
(関数) [編集]
ナローマルチバイト文字列をワイド文字列に変換する
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)