Namespaces
Variants

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

ja.cppreference.net より
< c | io
 
 
ファイル入出力
型とオブジェクト
        
関数
ファイルアクセス
(C95)
書式なし入出力
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

書式付き入力
 
ヘッダで定義 <wchar.h>
int wprintf( const wchar_t* format, ... );
(1) (C95 から)
(C99 までは)
int wprintf( const wchar_t* restrict format, ... );
(C99 から)
int fwprintf( FILE* stream, const wchar_t* format, ... );
(2) (C95 から)
(C99 までは)
int fwprintf( FILE* restrict stream,
              const wchar_t* restrict format, ... );
(C99 から)
int swprintf( wchar_t* buffer, size_t bufsz,
              const wchar_t* format, ... );
(3) (C95 から)
(C99 までは)
int swprintf( wchar_t* restrict buffer, size_t bufsz,
              const wchar_t* restrict format, ... );
(C99 から)
int wprintf_s( const wchar_t* restrict format, ... );
(4) (C11 から)
int fwprintf_s( FILE* restrict stream,
                const wchar_t* restrict format, ... );
(5) (C11 から)
int swprintf_s( wchar_t* restrict buffer, rsize_t bufsz,
                const wchar_t* restrict format, ... );
(6) (C11 から)
int snwprintf_s( wchar_t* restrict s, rsize_t n,
                 const wchar_t* restrict format, ... );
(7) (C11 から)

指定された場所からデータを読み込み、ワイド文字列に変換し、結果をさまざまな出力先に書き込みます。

1) 結果を stdout に書き込みます。
2) 結果をファイルストリーム stream に書き込みます。
3) bufsz が 0 より大きい場合、結果をワイド文字列 buffer に書き込みます。最大 bufsz - 1 ワイド文字を書き込み、その後ろにヌルワイド文字が続きます。bufsz が 0 の場合は何も書き込まれません (その場合 buffer はヌルポインタでも構いません)。
4-6) (1-3) と同じですが、以下のエラーが実行時に検出され、現在インストールされている 制約ハンドラ 関数が呼び出されます:
  • 変換指定子 %n が format
  • に存在する%s の対応する引数のいずれかがヌルポインタである
  • format または buffer がヌルポインタである
  • bufsz が 0 であるか RSIZE_MAX / sizeof(wchar_t)
  • より大きい
  • 文字列および文字の変換指定子でエンコードエラーが発生するswprintf_s(bufsz のみ) 書き込まれるワイド文字数 (ヌルを含む) が
を超える場合。7) (6)s と同じですが、
が指す配列に収まるように結果を切り詰める点が異なります。wprintf_s 他のすべての境界チェック関数と同様に、fwprintf_s、swprintf_s、snwprintf_s は、実装によって __STDC_LIB_EXT1__ が定義されており、ユーザーが __STDC_WANT_LIB_EXT1__ を整数定数 1 として <stdio.h> をインクルードする前に定義する場合にのみ利用できることが保証されます。

引数

stream - 書き込む出力ファイルストリーム
buffer - 書き込むワイド文字列へのポインタ
bufsz - 最大 bufsz - 1 ワイド文字 (ヌル終端を含む) が書き込まれます
format - データの解釈方法を指定するヌル終端ワイド文字列へのポインタ
... - 出力するデータを指定する引数。デフォルト引数昇格 後の引数が対応する変換指定子の期待する型でない場合、または format が必要とするよりも少ない引数しかない場合、動作は未定義です。format が必要とするよりも多くの引数がある場合、余分な引数は評価され無視されます。


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

  • 導入の % 文字。
  • (省略可能) 変換の動作を変更する1つ以上のフラグ:
  • -: 変換結果はフィールド内で左詰めになります (デフォルトでは右詰め)。
  • +: 符号付き変換の符号は常に変換結果の前に付加されます (デフォルトでは負の場合にのみマイナスが前に付きます)。
  • 空白: 符号付き変換の結果が符号文字で始まらない場合、または空の場合、空白が結果の前に付加されます。+ フラグが存在する場合は無視されます。
  • #: 変換の代替形式 が実行されます。詳細な効果は以下の表を参照してください。そうでない場合、動作は未定義です。
  • 0: 整数および浮動小数点数の変換では、フィールドのパディングに 空白 文字の代わりに先頭のゼロが使用されます。整数の場合、精度が明示的に指定されると無視されます。その他の変換でこのフラグを使用すると、動作は未定義になります。- フラグが存在する場合は無視されます。
  • (省略可能) 最小フィールド幅を指定する整数値または *。結果は、必要に応じて、右詰めの場合は左側に、左詰めの場合は右側に 空白 文字でパディングされます (デフォルト)。* が使用された場合、幅は int 型の追加の引数によって指定され、その引数は変換される引数 (および精度が指定されている場合はそれを指定する引数) の前に現れます。引数の値が負の場合、- フラグが指定され、正のフィールド幅になります (注意: これは最小幅であり、値が切り詰められることはありません)。
  • (省略可能) . に続いて整数、または *、またはどちらもなしで、変換の精度 を指定します。* が使用された場合、精度 は int 型の追加の引数によって指定され、その引数は変換される引数の前、かつ最小フィールド幅が指定されている場合はその引数の後に現れます。この引数の値が負の場合は無視されます。数値も * も使用されない場合、精度は 0 と見なされます。精度 の正確な効果は以下の表を参照してください。
  • (省略可能) 長さ修飾子 は、引数のサイズを指定します (変換書式指定子と組み合わせて、対応する引数の型を指定します)。
  • 変換書式指定子。

以下の書式指定子が利用可能です:

変換
指定子
説明 期待される
引数の型
長さ修飾子→ hh h なし l ll j z t L
C99 からのみ利用可能→ Yes Yes Yes Yes Yes
% リテラル % を書き込みます。完全な変換指定は %% でなければなりません。 N/A N/A N/A N/A N/A N/A N/A N/A N/A
c

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

  • 引数はまず wchar_t に変換されます (btowc を呼び出したかのように)。
  • l 修飾子が使用された場合、wint_t 引数はまず wchar_t に変換されます。
N/A N/A
int
wint_t
N/A N/A N/A N/A N/A
s

文字列 を書き込みます。

  • 引数は、初期シフト状態で開始するマルチバイト文字シーケンスを含む文字配列の先頭要素へのポインタでなければならず、ゼロ初期化された変換状態で mbrtowc を呼び出したかのようにワイド文字配列に変換されます。
  • 精度 は書き込むワイド文字の最大数を指定します。精度 が指定されていない場合、最初のヌル終端まで (ただし含まない) すべてのワイド文字を書き込みます。
  • l 指定子が使用された場合、引数は wchar_t の配列の先頭要素へのポインタでなければなりません。
N/A N/A
char*
wchar_t*
N/A N/A N/A N/A N/A
d
i

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

  • 精度 は表示する最小桁数を指定します。デフォルトの精度は 1 です。
  • 変換結果と精度の両方が 0 の場合、変換結果は文字になりません。
  • z 修飾子の場合、期待される引数の型は size_t の符号付きバージョンです。
signed char
short
int
long
long long
intmax_t
※
ptrdiff_t
N/A
b
B (省略可能)

(C23)

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

  • 精度 は表示する最小桁数を指定します。デフォルトの精度は 1 です。
  • 変換結果と精度の両方が 0 の場合、変換結果は文字になりません。
  • 代替実装 0b または 0B の場合、変換結果が非ゼロであれば、結果の前に前置されます。
unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long
uintmax_t
size_t
ptrdiff_t
の符号なしバージョンN/A
o

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

  • 精度 は表示する最小桁数を指定します。デフォルトの精度は 1 です。
  • 変換結果と精度の両方が 0 の場合、変換結果は文字になりません。
  • 代替実装 では、必要に応じて先頭にゼロを1つ書くために精度が増加します。その場合、変換結果と精度の両方が 0 の場合、単一の 0 が書き込まれます。
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 (C99)

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

  • 精度 は小数点文字の後に表示する正確な桁数を指定します。
  • デフォルトの精度は 6 です。
  • 代替実装 では、後ろに数字が続かなくても小数点文字が書き込まれます。
  • 無限大および非数の変換形式については ノート を参照してください。
N/A N/A
double
double (C99)
N/A N/A N/A N/A
long double
e
E

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

  • e 変換形式では [-]d.ddd e±dd が使用されます。
  • E 変換形式では [-]d.ddd E±dd が使用されます。
  • 指数は少なくとも2桁で、必要な場合のみそれ以上の桁が使用されます。
  • 値が 0 の場合、指数も 0 になります。
  • 精度 は小数点文字の後に表示する正確な桁数を指定します。
  • デフォルトの精度は 6 です。
  • 代替実装 では、後ろに数字が続かなくても小数点文字が書き込まれます。
  • 無限大および非数の変換形式については ノート を参照してください。
N/A N/A N/A N/A N/A N/A
a
A

(C99)

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

  • a 変換形式では [-] 0xh.hhh p±d が使用されます。
  • A 変換形式では [-] 0Xh.hhh P±d が使用されます。
  • 引数が正規化された浮動小数点値の場合、最初の16進数桁は 0 ではありません。
  • 値が 0 の場合、指数も 0 になります。
  • 精度 は16進小数点文字の後に表示する正確な桁数を指定します。
  • デフォルトの精度は値を正確に表現するのに十分です。
  • 代替実装 では、後ろに数字が続かなくても小数点文字が書き込まれます。
  • 無限大および非数の変換形式については ノート を参照してください。
N/A N/A N/A N/A N/A N/A
g
G

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

  • g 変換形式では、形式 e または f での変換が行われます。
  • G 変換形式では、形式 E または f(C99 までは)F(C99 から) での変換が行われます。
  • P を、精度が非ゼロの場合はその値、精度が指定されていない場合は 6、精度が 1 の場合は 0 とします。そして、形式 E での変換の指数が X の場合:
    • P > X ≥ −4 の場合、変換は形式 f または F(C99 から) で行われ、精度は P − 1 − X です。
    • そうでない場合、変換は形式 e または E で行われ、精度は P − 1 です。
  • 代替表現 が要求されない限り、末尾のゼロは削除され、小数部分がない場合は小数点文字も削除されます。
  • 無限大および非数の変換形式については ノート を参照してください。
N/A N/A N/A N/A N/A N/A
n

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

  • 結果は引数が指す値に書き込まれます。
  • この指定には フラグ、フィールド幅、精度 を含めることはできません。
  • z 修飾子の場合、期待される引数の型は S* です。ここで S は size_t の符号付きバージョンです。
signed char*
short*
int*
long*
long long*
intmax_t*
※
 ptrdiff_t* 
N/A
p

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

N/A N/A
void*
N/A N/A N/A N/A N/A N/A
ノート

浮動小数点数の変換関数は、無限大を inf または infinity に変換します。どちらが使用されるかは実装定義です。

非数は nan または nan(char_sequence) に変換されます。どちらが使用されるかは実装定義です。

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

char、unsigned char、signed char、short、unsigned short を出力するために使用される変換指定子は、デフォルト引数昇格 の昇格された型を期待しますが、出力前にその値は char、unsigned char、signed char、short、unsigned short に変換されます。可変引数関数が呼び出されるときに昇格が行われるため、これらの型の値を渡しても安全です。

固定幅文字型 (int8_t など) の正しい変換指定子は、ヘッダ <inttypes.h> で定義されています (ただし PRIdMAX、PRIuMAX などは %jd、%ju と同義です)。

メモリ書き込み変換指定子 %n は、書式文字列がユーザー入力に依存する場合のセキュリティエクスプロイトの一般的な標的であり、境界チェック付きの 系の関数ではサポートされていませんprintf_s(C11 から)。

各変換指定子の動作の後にはシーケンスポイント があります。これにより、複数の %n の結果を同じ変数に格納したり、同じ呼び出し内で以前の %n によって変更された文字列を出力するなどのエッジケースが可能です。

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

戻り値

1,2) 成功した場合は書き込まれたワイド文字数、エラーが発生した場合は負の値。
3) 成功した場合は書き込まれたワイド文字数 (終端のヌルワイド文字は含まない)、エンコードエラーが発生した場合、または生成される文字数が bufsz 以上だった場合 (bufsz がゼロの場合を含む) は負の値。
4,5) 成功した場合は書き込まれたワイド文字数、エラーが発生した場合は負の値。
6) buffer に書き込まれたワイド文字数 (終端のヌルは含まない)。エンコードエラーおよびオーバーフロー時には負の値を返します。その他のエラーではゼロを返します。
7) buffer が十分な大きさであった場合に bufsz に書き込まれたであろうワイド文字数 (終端のヌルは含まない)、またはエラーが発生した場合は負の値 (つまり、書き込みが成功して完全に行われたのは、戻り値が非負で bufsz 未満の場合のみです)。

ノート

ナロー文字列には snprintf があり、必要な出力バッファサイズを決定できますが、ワイド文字列には同等のものはありませんでした ( までは)snwprintf_s(C11 から)。そのため、プログラムはバッファサイズを決定するために、 を呼び出し、結果を確認し、より大きなバッファを再割り当てして、成功するまで繰り返す必要があるかもしれません。 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 terminator
    setlocale(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ß水🍌'

参考文献

  • C23 規格 (ISO/IEC 9899:2024):
  • 7.29.2.1 The fwprintf function (p: TBD)
  • 7.29.2.3 The swprintf function (p: TBD)
  • 7.29.2.11 The wprintf function (p: TBD)
  • K.3.9.1.1 The fwprintf_s function (p: TBD)
  • K.3.9.1.4 The swprintf_s function (p: TBD)
  • K.3.9.1.13 The wprintf_s function (p: TBD)
  • C17 規格 (ISO/IEC 9899:2018):
  • 7.29.2.1 The fwprintf function (p: TBD)
  • 7.29.2.3 The swprintf function (p: TBD)
  • 7.29.2.11 The wprintf function (p: TBD)
  • K.3.9.1.1 The fwprintf_s function (p: TBD)
  • K.3.9.1.4 The swprintf_s function (p: TBD)
  • K.3.9.1.13 The wprintf_s function (p: TBD)
  • C11 規格 (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 規格 (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、ファイルストリーム、またはバッファに出力します
(関数)
可変引数リストを使用して、書式付きワイド文字出力を stdout、ファイルストリーム
またはバッファに出力します
(関数)
(C95)
ワイド文字列をファイルストリームに書き込みます
(関数)
C++ ドキュメント for wprintf, fwprintf, swprintf