名前空間
変種
操作

wprintf, fwprintf, swprintf, wprintf_s, fwprintf_s, swprintf_s, snwprintf_s

提供: cppreference.com
< c‎ | io
 
 
ファイル入出力
型とオブジェクト
関数
ファイルアクセス
直接入出力
書式なし入出力
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)
書式付き入力
書式付き出力
wprintffwprintfswprintfwprintf_sfwprintf_sswprintf_ssnwprintf_s
(C95)(C95)(C95)(C11)(C11)(C11)(C11)
ファイル位置操作
エラー処理
ファイルに対する操作
 
ヘッダ <wchar.h> で定義
(1)
int wprintf(constwchar_t*format, ... );
(C95以上)
(C99未満)
int wprintf(constwchar_t*restrict format, ... );
(C99以上)
(2)
int fwprintf(FILE*stream, constwchar_t* format, ... );
(C95以上)
(C99未満)
int fwprintf(FILE*restrict stream,
              constwchar_t*restrict format, ... );
(C99以上)
(3)
int swprintf(wchar_t*buffer, size_t bufsz,
              constwchar_t* format, ... );
(C95以上)
(C99未満)
int swprintf(wchar_t*restrict buffer, size_t bufsz,
              constwchar_t*restrict format, ... );
(C99以上)
int wprintf_s(constwchar_t*restrict format, ...);
(4) (C11以上)
int fwprintf_s(FILE*restrict stream,
                constwchar_t*restrict format, ...);
(5) (C11以上)
int swprintf_s(wchar_t*restrict buffer, rsize_t bufsz,
                constwchar_t*restrict format, ...);
(6) (C11以上)
int snwprintf_s(wchar_t*restrict s, rsize_t n,
                 constwchar_t*restrict format, ...);
(7) (C11以上)

指定された位置からデータをロードし、それらをワイド文字列に変換し、結果を様々なシンクに書き込みます。

1) 結果を stdout に書き込みます。
2) 結果をファイルストリーム stream に書き込みます。
3)bufsz がゼロより大きい場合は、結果をワイド文字列 buffer に書き込みます。 最大 bufsz-1 個のワイド文字とそれに続くヌルワイド文字が書き込まれます。 bufsz がゼロの場合は、何も書き込まれません (buffer はヌルポインタでも構いません) が、その場合でも戻り値 (本来書き込まれたはずのワイド文字数) は計算され、返されます。
4-6)(1-3) と同じですが、以下のエラーが実行時に検出され、現在設定されている制約ハンドラ関数を呼びます。
  • format に変換指定子 %n が存在する。
  • %s に対応するいずれかの引数がヌルポインタ。
  • format または buffer がヌルポインタ。
  • bufsz がゼロまたは RSIZE_MAX/sizeof(wchar_t) より大きい。
  • いずれかの文字列または文字変換指定子でエンコーディングエラーが発生する。
  • (swprintf_s の場合のみ) 書き込まれるワイド文字数 (ヌルを含む) が bufsz を超える。
7)(6) と同じですが、結果を s の指す配列に収まるように切り捨てます。
すべての境界チェック付き関数と同様に、 wprintf_sfwprintf_sswprintf_s および snwprintf_s__STDC_LIB_EXT1__ が処理系によって定義されていて、 <wchar.h> をインクルードする前にユーザが __STDC_WANT_LIB_EXT1__ を整数定数 1 に定義した場合にのみ、利用可能であることが保証されます。

目次

[編集]引数

stream - 書き込む出力ファイルストリーム
buffer - 書き込むワイド文字列を指すポインタ
bufsz - 最大 bufsz-1 個のワイド文字およびヌル終端が書き込まれる可能性があります
format - データの解釈方法を指定するヌル終端ワイド文字列を指すポインタ。

書式文字列は、変更されずに出力ストリームにコピーされる (% を除く) 通常のワイド文字と、変換指定から構成されます。 各変換指定は以下の書式を持ちます。

  • 最初の % 文字。
  • (オプション) 変換の動作を変更する1つ以上のフラグ。
  • - : 変換の結果をフィールド内で左詰めします (デフォルトでは右詰めされます)。
  • + : 符号付き変換の符号が必ず変換の結果の前に付加されます (デフォルトでは負の場合にのみマイナスが結果の前に付加されます)。
  • 空白 : 符号付き変換の結果が符号文字で始まらない、または空の場合、空白が結果の前に付加されます。 + フラグが存在する場合、このフラグは無視されます。
  • # : 変換の代替形式が行われます。 正確な効果は下の表を参照してください。 記載がなければ動作は未定義です。
  • 0 : 整数または浮動小数点数の変換に対して、フィールドをパディングするために空白文字の代わりに先行するゼロが使用されます。 整数の場合、精度が明示的に指定されていれば、このフラグは無視されます。 それ以外の変換に対してこのフラグを使用した結果は未定義動作です。 - フラグが存在する場合、このフラグは無視されます。
  • (オプション) 最小フィールド幅を指定する整数値または *。 結果は、必要の場合は、左詰めの場合は右側に、右詰めの場合は左側に、 (デフォルトでは) 空白文字で、パディングされます。 * が使用された場合、幅は int 型の追加の引数によって指定されます。 引数の値が負の場合は、 - フラグと正のフィールド幅として解釈されます。 (ノート: これは最小の幅です。 値が切り捨てられることはありません。)
  • (オプション) 変換の精度を指定する . に続く整数または *、またはそのいずれも続かない単体の .* が使用された場合、 精度int 型の追加の引数によって指定されます。 この引数の値が負の場合、それは無視されます。 数値も * も続かない単体の . が使用された場合、精度はゼロとして扱われます。 精度 の正確な効果は下の表を参照してください。
  • (オプション) 引数のサイズを指定する長さ修飾子 (変換書式指定子と組み合わせて、対応する引数の型を指定します)。
  • 変換書式指定子。

以下の書式指定子が利用できます。

変換指定子 説明 期待する引数の型
長さ修飾子
hh

(C99)

h なし lll

(C99)

j

(C99)

z

(C99)

t

(C99)

L
%% を書き込みます。 変換指定全体が %% でなければなりません。 N/AN/AN/AN/AN/AN/AN/AN/AN/A
c

単一の文字を書き込みます。

引数はまず、 btowc を呼んだかのように、 wchar_t に変換されます。 l 修飾子が使用された場合は、 wint_t 引数がまず wchar_t に変換されます。

N/AN/A
int
wint_t
N/AN/AN/AN/AN/A
s

文字列を書き込みます。

引数は初期シフト状態で始まるマルチバイト文字シーケンスを格納している文字配列の最初の要素を指すポインタでなければなりません。 それは、ゼロ初期化された変換状態を使用して mbrtowc を呼んだかのように、ワイド文字配列に変換されます。 精度は書き込まれる最大ワイド文字数を指定します。 精度が指定されていない場合は、最初のヌル終端に達するまで、すべてのワイド文字が書き込まれます (ヌル終端は書き込まれません)。 l' 修飾子が使用された場合は、引数は wchar_t 配列の最初の要素を指すポインタでなければなりません。

N/AN/A
char*
wchar_t*
N/AN/AN/AN/AN/A
d
i

符号付き整数を10進表現 [-]dddd に変換します。

精度は出力される最小桁数を指定します。 デフォルトの精度は 1 です。 変換後の値と精度がどちらも 0 であれば変換結果は空文字列になります。

signedchar
short
int
long
longlong
signed size_t
N/A
o

符号なし整数を8進数表現 oooo に変換します。

精度は出力される最小桁数を指定します。 デフォルトの精度は 1 です。 変換後の値と精度がどちらも 0 であれば変換結果は空文字列になります。 代替表現では前にゼロを1個付加するために必要に応じて精度が増えます。 その場合、変換後の値と精度がどちらも 0 であれば単一の 0 が書き込まれます。

unsignedchar
unsignedshort
unsignedint
unsignedlong
unsignedlonglong
unsigned version of ptrdiff_t
N/A
x
X

符号なし整数を16進数表現 hhhh に変換します。

x 変換の場合は文字 abcdef が使用されます。 X 変換の場合は文字 ABCDEF が使用されます。

精度は出力される最小桁数を指定します。 デフォルトの精度は 1 です。 変換後の値と精度がどちらも 0 であれば変換結果は空文字列になります。 代替表現では変換結果がゼロでなければ結果の前に 0x または 0X が付加されます。

N/A
u

符号なし整数を10進数表現 dddd に変換します。

精度は出力される最小桁数を指定します。 デフォルトの精度は 1 です。 変換後の値と精度がどちらも 0 であれば変換結果は空文字列になります。

N/A
f
F

浮動小数点数[-]ddd.ddd 形式の10進数表記に変換します。

精度は小数点以下の正確な桁数を指定します。 デフォルトの精度は 6 です。 代替表現では小数点の後に何もなくても小数点文字が書き込まれます。 無限大および非数の変換形式についてはノートを参照してください。

N/AN/A
double
double(C99)
N/AN/AN/AN/A
longdouble
e
E

浮動小数点数を10進数の指数表記に変換します。

e 変換の場合は [-]d.ddde±dd 形式が使用されます。 E 変換の場合は [-]d.dddE±dd 形式が使用されます。

指数は少なくとも2桁あり、必要に応じて桁数が増えます。 値が 0 であれば、指数も 0 になります。 精度は小数点以下の最小桁数を指定します。 デフォルトの精度は 6 です。 代替表現では小数点の後に何もなくても小数点文字が書き込まれます。 無限大および非数の変換形式についてはノートを参照してください。

N/AN/AN/AN/AN/AN/A
a
A

(C99)

浮動小数点数を16進数の指数表記に変換します。

a 変換の場合は [-]0xh.hhhp±d 形式が使用されます。 A 変換の場合は [-]0Xh.hhhP±d 形式が使用されます。

引数が正規化浮動小数点数の場合、最初の16進数桁は 0 になりません。 値が 0 であれば、指数も 0 になります。 精度は小数点以下の最小桁数を指定します。 デフォルトの精度は値を正確に表現するのに十分な値です。 代替表現では小数点の後に何もなくても小数点文字が書き込まれます。 無限大および非数の変換形式についてはノートを参照してください。

N/AN/AN/AN/AN/AN/A
g
G

浮動小数点数を値と精度に応じて10進数表記または10進数の指数表記に変換します。

g 変換の場合は e または f 形式の変換が行われます。 G 変換の場合は E または F 形式の変換が行われます。

P を非ゼロの場合は精度と等しい値、精度が指定されていない場合は 6、精度が 0 の場合は 1 と置いたとき、 E 形式の変換で指数が X である場合、

  • P > X ≥ −4 であれば、変換は f または F の形式と P − 1 − X の精度を持ちます。
  • そうでなければ、変換は e または E の形式と P − 1 の精度を持ちます。

代替表現が要求されなければ、末尾のゼロは削除され、小数点以下が残っていなければ、小数点文字も削除されます。 無限大および非数の変換形式についてはノートを参照してください。

N/AN/AN/AN/AN/AN/A
n

関数のこの呼び出しによってそれまでに書き込まれた文字数を返します。

結果は引数の指している値に書き込まれます。 仕様はフラグフィールド幅精度のいずれも含んでいてはいけません。

signedchar*
short*
int*
long*
longlong*
signed size_t*
N/A
p

ポインタを定義する処理系定義の文字シーケンスを書き込みます。

N/AN/Avoid*N/AN/AN/AN/AN/AN/A

浮動小数点変換関数は無限大を inf または infinity に変換します。 いずれが使用されるかは処理系定義です。

非数は nan または nan(char_sequence) に変換されます。 いずれが使用されるかは処理系定義です。

変換 F, E, G, A は代わりに INF, INFINITY, NAN を出力します。

%cint 引数を期待しますが、可変長引数関数が呼ばれるときに行われる整数昇格のため、 char を渡しても安全です。

固定幅の整数型 (int8_t など) に対する正しい変換指定はヘッダ <inttypes.h> で定義されています (PRIdMAX, PRIuMAX などは %jd, %ju などの同義語ですが)。

メモリに書き込む変換指定子 %n は、書式文字列がユーザ入力に依存する場合、セキュリティエクスプロイトのよくあるターゲットであり、境界チェック付きの printf_s ファミリーの関数ではサポートされていません。

変換指定子それぞれの動作後に副作用完了点があります。 これにより同じ変数に複数の %n の結果を格納することができ、またエッジケースとして、同じ呼び出しの中で先行する %n によって変更された値を表示することができます。

変換指定が無効な場合、動作は未定義です。


... - 表示するデータを指定する引数。 デフォルト引数昇格後のいずれかの引数が対応する変換指定子の期待する型でない場合、または format が要求するより少ない引数しかない場合、動作は未定義です。 format が要求するより多くの引数がある場合、余分な引数は評価され、無視されます

[編集]戻り値

1,2) 成功した場合は書き込まれた文字数、エラーが発生した場合は負の値。
3) 成功した場合は書き込まれたワイド文字数 (終端のヌルワイド文字は含みません)、エンコーディングエラーが発生した場合または生成された文字数が size より大きいまたは等しい (size がゼロのときも含みます) 場合は負の値。
4,5) 成功した場合は書き込まれた文字数、エラーが発生した場合は負の値。
6)buffer に書き込まれたワイド文字数 (終端のヌルワイド文字は含みません)。 エンコーディングエラーまたはオーバーフローの場合は負の値を返します。 他のすべてのエラーの場合はゼロを返します。
7)bufsz が十分に大きければ buffer に書き込まれたであろうワイド文字数 (終端のヌルワイド文字は含みません)、エラーが発生した場合は負の値 (つまり、書き込みは戻り値が非負かつ bufsz より小さい場合にのみ成功し、完全になります)。

[編集]ノート

ナロー文字列が要求される出力バッファサイズを調べられる snprintf を提供する一方、ワイド文字列に対する同等な関数はありません。 バッファサイズを決定するためには、 swprintf を呼び、結果の値をチェックし、より大きなバッファを確保し直し、成功するまで同様に試みる必要があります。

snwprintf_s は、 swprintf_s と異なり、ほとんどの境界チェック付き関数が切り捨てをエラーとして扱うところ、 buffer の指す配列内に収まるよう結果を切り捨てます。

[編集]

#include <locale.h>#include <wchar.h>   int main(void){char narrow_str[]="z\u00df\u6c34\U0001f34c";// or "zß水🍌"// or "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9f\x8d\x8c";wchar_t warr[29];// the expected string is 28 characters plus 1 null terminatorsetlocale(LC_ALL, "en_US.utf8"); swprintf(warr, sizeof warr/sizeof*warr, L"Converted from UTF-8: '%s'", narrow_str); wprintf(L"%ls\n", warr);}

出力:

Converted from UTF-8: 'zß水🍌'

[編集]参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 7.29.2.1 The fwprintf function (p: 403-410)
  • 7.29.2.3 The swprintf function (p: 416)
  • 7.29.2.11 The wprintf function (p: 421)
  • K.3.9.1.1 The fwprintf_s function (p: 628)
  • K.3.9.1.4 The swprintf_s function (p: 630-631)
  • K.3.9.1.13 The wprintf_s function (p: 637-638)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.24.2.1 The fwprintf function (p: 349-356)
  • 7.24.2.3 The swprintf function (p: 362)
  • 7.24.2.11 The wprintf function (p: 366)

[編集]関連項目

stdout、ファイルストリームまたはバッファに書式付き出力を書き出します
(関数)[edit]
stdout、ファイルストリームまたはバッファに可変個引数リストを使用して書式付きワイド文字出力を書き出します
(関数)[edit]
(C95)
ファイルストリームにワイド文字列を書き込みます
(関数)[edit]
wprintf, fwprintf, swprintfC++リファレンス
close