Namespaces
Variants

vprintf, vfprintf, vsprintf, vsnprintf, vprintf_s, vfprintf_s, vsprintf_s, vsnprintf_s

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

書式付き入力
 
ヘッダ <stdio.h>
int vprintf( const char* format, va_list vlist );
で定義 (1) (C99まで)
int vprintf( const char* restrict format, va_list vlist );
(C99以降)
int vfprintf( FILE* stream, const char* format, va_list vlist );
(2) (C99まで)
int vfprintf( FILE* restrict stream, const char* restrict format,
              va_list vlist );
(C99以降)
int vsprintf( char* buffer, const char* format, va_list vlist );
(3) (C99まで)
int vsprintf( char* restrict buffer, const char* restrict format,
              va_list vlist );
(C99以降)
int vsnprintf( char* restrict buffer, size_t bufsz,
               const char* restrict format, va_list vlist );
(4) (C99以降)
int vprintf_s( const char* restrict format, va_list vlist );
(5) (C11以降)
int vfprintf_s( FILE* restrict stream, const char* restrict format,
                va_list vlist );
(6) (C11以降)
int vsprintf_s( char* restrict buffer, rsize_t bufsz,
                const char* restrict format, va_list vlist );
(7) (C11以降)
int vsnprintf_s( char* restrict buffer, rsize_t bufsz,
                 const char* restrict format, va_list vlist );
(8) (C11以降)

vlist で指定された位置からデータを読み込み、文字列相当に変換し、結果を様々な出力先に書き込みます。

1) stdout に結果を書き込みます。
2) ファイルストリーム stream に結果を書き込みます。
3) 文字列 buffer に結果を書き込みます。
4) 文字列 buffer に結果を書き込みます。最大 bufsz - 1 文字書き込まれます。結果の文字列は、bufsz がゼロでない限り、ヌル文字で終端されます。bufsz がゼロの場合、何も書き込まれず、buffer はヌルポインタでも構いませんが、戻り値(ヌル終端文字を含まない、書き込まれるはずだったバイト数)は依然として計算されて返されます。
5-8) (1-4) と同じですが、実行時に以下のエラーが検出され、現在インストールされている 制約ハンドラ 関数が呼び出されます:
  • %n 変換指定子が format
  • に存在する。%s に対応する引数のいずれかがヌルポインタである。
  • format または buffer がヌルポインタである。
  • bufsz がゼロであるか、RSIZE_MAX
  • より大きい。文字および文字変換指定子でエンコーディングエラーが発生する。
  • (vsprintf_s の場合のみ)、buffer に格納する文字列(末尾のヌルを含む)が bufsz
を超える。 すべての境界チェック付き関数と同様に、vprintf_s、vfprintf_s、vsprintf_s、vsnprintf_s は、実装が __STDC_LIB_EXT1__ を定義しており、ユーザーが __STDC_WANT_LIB_EXT1__ を整数定数 1 として <stdio.h> をインクルードする前に定義した場合にのみ使用可能であることが保証されます。

引数

stream - 書き込む出力ファイルストリーム
buffer - 書き込む文字列へのポインタ
bufsz - 最大 bufsz - 1 文字(ヌル終端を含む)を書き込み可能
format - データの解釈方法を指定するヌル終端文字列へのポインタ
vlist - 出力するデータを含む可変引数リスト

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

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

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

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

1文字 を書き込みます。

  • 引数は最初に unsigned char に変換されます。
  • l 修飾子が使用された場合、引数はまず %ls に wchar_t[2] 引数を指定した場合と同様に文字列に変換されます。
N/A N/A
int
wint_t
N/A N/A N/A N/A N/A
s

文字列 を書き込みます。

  • 引数は文字配列の先頭要素へのポインタでなければなりません。
  • 精度 は書き込む最大バイト数を指定します。精度 が指定されない場合、最初のヌル終端文字まで(ただし含まない)すべてのバイトを書き込みます。
  • l 指定子が使用された場合、引数は wchar_t の配列の先頭要素へのポインタでなければならず、ゼロ初期化された変換状態を持つ wcrtomb の呼び出しと同様に char 配列に変換されます。
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)

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

  • 精度 は小数点文字の後に表示する正確な桁数を指定します。
  • デフォルトの精度は 6 です。
  • 代替形式 では、続く桁がなくても小数点文字が書き込まれます。
  • 無限大とNaNの変換形式については ノート を参照してください。
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 です。
  • 代替形式 では、続く桁がなくても小数点文字が書き込まれます。
  • 無限大とNaNの変換形式については ノート を参照してください。
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進小数点文字の後に表示する正確な桁数を指定します。
  • デフォルトの精度は値の正確な表現に十分です。
  • 代替形式 では、続く桁がなくても小数点文字が書き込まれます。
  • 無限大とNaNの変換形式については ノート を参照してください。
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 で行われます。
  • 代替表現 が要求されない限り、末尾のゼロは削除され、小数部分が残っていない場合は小数点文字も削除されます。
  • 無限大とNaNの変換形式については ノート を参照してください。
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 または 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-3) 成功した場合は書き込まれた文字数、エラーが発生した場合は負の値。
4) 成功した場合は書き込まれた文字数、エラーが発生した場合は負の値。結果の文字列が buf_size の制限により切り詰められた場合、関数は制限がなかった場合に書き込まれたであろう文字数の合計(終端ヌルバイトを除く)を返します。
5,6) 出力ストリームに送信された文字数、または出力エラー、実行時制約違反エラー、エンコーディングエラーが発生した場合は負の値。
7) buffer に書き込まれた文字数(ヌル文字を除く。ただし buffer がヌルポインタではなく、bufsz がゼロでなく、RSIZE_MAX 以下である限り常に書き込まれる)、または実行時制約違反の場合はゼロ、エンコーディングエラーの場合は負の値。
8) 終端ヌル文字を除いた文字数(buffer がヌルポインタではなく、bufsz がゼロでなく、RSIZE_MAX 以下であれば常に書き込まれる)、または buffer に書き込まれたであろう文字数(bufsz が無視された場合)、または実行時制約違反またはエンコーディングエラーが発生した場合は負の値。

ノート

これらの関数はすべて va_arg を少なくとも1回呼び出し、戻り後は arg の値は不定です。これらの関数は va_end を呼び出さないため、呼び出し側が行う必要があります。

vsnprintf_s、vsprintf_s とは異なり、結果を buffer が指す配列に収まるように切り詰めます。

vsnprintf_s の Microsoft CRT での実装は C 標準に準拠していません。Microsoft 版では、3番目の位置に追加のパラメータ size_t count があり、書き込む最大文字数(ヌル終端を含まない)を指定します。このパラメータは、パラメータ size_t bufsz で提供されるバッファサイズとは異なる可能性があります。

例

#include <stdarg.h>
#include <stdio.h>
#include <time.h>

void debug_log(const char* fmt, ...)
{
    struct timespec ts;
    timespec_get(&ts, TIME_UTC);
    char time_buf[100];
    size_t rc = strftime(time_buf, sizeof time_buf, "%D %T", gmtime(&ts.tv_sec));
    snprintf(time_buf + rc, sizeof time_buf - rc, ".%06ld UTC", ts.tv_nsec / 1000);

    va_list args1;
    va_start(args1, fmt);
    va_list args2;
    va_copy(args2, args1);
    char buf[1+vsnprintf(NULL, 0, fmt, args1)];
    va_end(args1);
    vsnprintf(buf, sizeof buf, fmt, args2);
    va_end(args2);

    printf("%s [debug]: %s\n", time_buf, buf);
}

int main(void)
{
    debug_log("Logging, %d, %d, %d", 1, 2, 3);
}

出力例:

02/20/15 21:58:09.072683 UTC [debug]: Logging, 1, 2, 3

参考文献

  • C23 標準 (ISO/IEC 9899:2024):
  • 7.21.6.8 The vfprintf function (p: TBD)
  • 7.21.6.10 The vprintf function (p: TBD)
  • 7.21.6.12 The vsnprintf function (p: TBD)
  • 7.21.6.13 The vsprintf function (p: TBD)
  • K.3.5.3.8 The vfprintf_s function (p: TBD)
  • K.3.5.3.10 The vprintf_s function (p: TBD)
  • K.3.5.3.12 The vsnprintf_s function (p: TBD)
  • K.3.5.3.13 The vsprintf_s function (p: TBD)
  • C17 標準 (ISO/IEC 9899:2018):
  • 7.21.6.8 The vfprintf function (p: 238)
  • 7.21.6.10 The vprintf function (p: 239)
  • 7.21.6.12 The vsnprintf function (p: 239-240)
  • 7.21.6.13 The vsprintf function (p: 240)
  • K.3.5.3.8 The vfprintf_s function (p: 434)
  • K.3.5.3.10 The vprintf_s function (p: 435)
  • K.3.5.3.12 The vsnprintf_s function (p: 436-437)
  • K.3.5.3.13 The vsprintf_s function (p: 437)
  • C11 標準 (ISO/IEC 9899:2011):
  • 7.21.6.8 The vfprintf function (p: 326-327)
  • 7.21.6.10 The vprintf function (p: 328)
  • 7.21.6.12 The vsnprintf function (p: 329)
  • 7.21.6.13 The vsprintf function (p: 329)
  • K.3.5.3.8 The vfprintf_s function (p: 597)
  • K.3.5.3.10 The vprintf_s function (p: 598-599)
  • K.3.5.3.12 The vsnprintf_s function (p: 600)
  • K.3.5.3.13 The vsprintf_s function (p: 601)
  • C99 標準 (ISO/IEC 9899:1999):
  • 7.19.6.8 The vfprintf function (p: 292)
  • 7.19.6.10 The vprintf function (p: 293)
  • 7.19.6.12 The vsnprintf function (p: 294)
  • 7.19.6.13 The vsprintf function (p: 295)
  • C89/C90 標準 (ISO/IEC 9899:1990):
  • 4.9.6.7 The vfprintf function
  • 4.9.6.8 The vprintf function
  • 4.9.6.9 The vsprintf function

関連項目

可変引数リストを使用して、stdout、ファイルストリーム
、またはバッファにワイド文字の書式付き出力を出力します
(関数)
stdout、ファイルストリーム、またはバッファに書式付き出力を出力します
(関数)
可変引数リストを使用して、stdin、ファイルストリーム、またはバッファから書式付き入力を読み取ります

(関数)
C++ ドキュメント for vprintf, vfprintf, vsprintf, vsnprintf