WPRINTF(3)

名前
wprintf, fwprintf, swprintf, vwprintf, vfwprintf, vswprintf - ワイド文字を フォーマットして出力する

書式
#include <stdio.h>
#include <wchar.h>

int wprintf(const wchar_t *format, ...);
int fwprintf(FILE *stream, const wchar_t *format, ...);
int swprintf(wchar_t *wcs, size_t maxlen,
             const wchar_t *format, ...);

int vwprintf(const wchar_t *format, va_list args);
int vfwprintf(FILE *stream, const wchar_t *format, va_list args);
int vswprintf(wchar_t *wcs, size_t maxlen,
              const wchar_t *format, va_list args);

    glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):

上記の全ての関数:
    _XOPEN_SOURCE >= 500 || _ISOC99_SOURCE ||
    _POSIX_C_SOURCE >= 200112L

説明
wprintf() ファミリーの関数は printf(3) ファミリーの関数の ワイド文字版である。これらはワイド文字をフォーマットして出力する。

wprintf() と vwprintf() 関数は stdout に出力を行なう。 stdout がバイト単位入出力であってはいけない。より詳しい説明は fwide(3) を参照すること。

fwprintf() と vfwprintf() 関数は stream にワイド文字出力 を行なう。 stream がバイト単位入出力であってはいけない。 より詳しい説明は fwide(3) を参照すること。

swprintf() と vswprintf() 関数はワイド文字の配列に ワイド文字出力を行なう。プログラマーは wcs に最低でも maxlen 文字のワイド文字を出力できる空きがあることを保証しなければ ならない。

これらの関数は printf(3), vprintf(3), fprintf(3), vfprintf(3), sprintf(3), vsprintf(3) 関数に似ているが以下の 点で異っている。

•   format がワイド文字列で与えられる。

•   出力がバイトではなくワイド文字で構成される。

•   swprintf() と vswprintf() は maxlen 引数を取るが、 sprintf() と vsprintf() は取らない (snprintf() と vsnprintf() は maxlen 引数を取るが これらの関数が Linux では、バッファーが溢れた場合でも -1 を返さない)。

c と s 変換文字の扱いが異っている:

c   もし l 修飾子が存在しない場合は int 引数は btowc(3) 関数によってワイド文字に変換される。そして結果のワイド文字が出力される。 l 修飾子が存在する場合は wint_t (ワイド文字)引数が出力される。

s   もし l 修飾子が存在しない場合、 const char * 引数は初期状態より始まるマルチバイト文字列を含んだ char 型の配列へのポインター(文字列へのポインター)とみなされる。 配列の文字は(最初のバイト前に初期状態で変換を開始し、それぞれの文字を mbrtowc(3) 関数によって)ワイド文字へと変換される。結果のワイド文字は終端の ナルワイド文字 (L'\0') の手前までが書き込まれる。精度(precision)が指定された 場合、指定された数字を超えるワイド文字は書き込まれない。精度は 書き込まれる バイト 数や 画面上の位置 ではなく ワイド文字 の数を指定することに注意すること。 精度がない場合には配列の終端にナルバイト ('\0') を含む必要がある。 精度を指定する場合には、配列の最後に到着する前に変換されたワイド文字の 数がそれに到達するよう、精度は十分に小さな数でなければならない。 もし l 修飾子が存在する場合、 const wchar_t * 引数はワイド文字の配列へのポインターとみなされる。 配列のワイド文字列は終端のナルワイド文字の手間まで出力される。 もし精度が指定された場合には指定された精度以上の文字は出力されない。 精度を指定しない場合には終端のナルワイド文字を含む必要がある。 精度を指定する場合にはそれはワイド文字の配列の大きさよりも小さくな ければならない。

返り値
これらの関数は書き込まれたワイド文字の文字数を返す。 swprintf() と vswprintf() 関数の場合は 終端のナルワイド文字は含まない。エラーが起こった場合は -1 を返す。

属性
この節で使用されている用語の説明については、 attributes(7) を参照。
インターフェース | 属性 | 値
wprintf(), fwprintf(), swprintf(), vwprintf(), vfwprintf(), vswprintf() | Thread safety | MT-Safe locale

準拠
POSIX.1-2001, POSIX.1-2008, C99.

注意
wprintf() 等の動作は現在のロケールの LC_CTYPE カテゴリーに依存している。

format 文字列が ASCII 以外のワイド文字を含んでいる場合、 実行時のロケールの LC_CTYPE カテゴリーがコンパイル時の LC_CTYPE カテゴリーと 一致している場合にのみプログラムは正常に動作する。これは wchar_t の表現がロケールやプラットホームに依存していることに原因がある。 (glibc ではワイド文字として Unicode (ISO-10646) のコードポイントを 使用している。他のプラットホームではそうではない。同様に ISO C99 の \unnnn 形式の汎用文字名称はこの問題を解決しない。) このため国際化されたプログラムでは format 文字列を ASCII ワイド 文字のみにするか、実行時に国際化された方法で構成する必要がある (例えば gettext() と iconv() や mbstowcs() を組み合わて使用する)。

関連項目
fprintf(3), fputwc(3), fwide(3), printf(3), snprintf(3)

この文書について
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。