vprintf、vfprintf、vsprintf、vsnprintf、vprintf_s、vfprintf_s、vsprintf_s、vsnprintf_s
| ヘッダー <stdio.h> で定義 |
||
| (1) | ||
| int vprintf( const char* format, va_list vlist ); |
(C99まで) | |
| int vprintf( const char* restrict format, va_list vlist ); |
(C99以降) | |
| (2) | ||
| int vfprintf( FILE* stream, const char* format, va_list vlist ); |
(C99まで) | |
| int vfprintf( FILE* restrict stream, const char* restrict format, va_list vlist ); |
(C99以降) | |
| (3) | ||
| int vsprintf( char* buffer, const char* format, va_list vlist ); |
(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によって定義された場所からデータをロードし、それらを文字列表現に変換して、様々なシンクに結果を書き込みます。
streamに書き込みます。- format に変換指定子
%nが存在する場合 %sに対応する引数がヌルポインタの場合-
formatまたはbufferがヌルポインタである - bufsz がゼロまたは RSIZE_MAX より大きい。
- 文字列および文字変換指定子でエンコーディングエラーが発生した場合
- (
vsprintf_sのみ) buffer に格納される文字列(末尾のヌルを含む)が bufsz を超える。
- format に変換指定子
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つ以上のフラグ
-
-: 変換の結果はフィールド内で左寄せされます (デフォルトは右寄せ)。 -
+: 符号付き変換の結果には常に符号が前置されます (デフォルトでは負の場合にのみマイナスが前置されます)。 - space: 符号付き変換の結果が符号文字で始まらない場合、または空の場合、スペースが結果の前に付加されます。
+フラグが存在する場合は無視されます。 -
#: 変換の代替形式が実行されます。正確な効果については以下の表を参照してください。それ以外の場合、動作は未定義です。 -
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
|
単一の文字を書き込みます。
|
N/A | N/A | int |
wint_t |
N/A | N/A | N/A | N/A | N/A |
s
|
文字列を書き込みます。
|
N/A | N/A | char* |
wchar_t* |
N/A | N/A | N/A | N/A | N/A |
di
|
符号付き整数を10進数表現 [-]dddd に変換します。
|
signed char |
short |
int |
long |
long long |
※ |
N/A | ||
o
|
符号なし整数を8進数表現 oooo に変換します。
|
unsigned char |
unsigned short |
unsigned int |
unsigned long |
unsigned long long |
ptrdiff_t の符号付きバージョン。 |
N/A | ||
xX
|
符号なし整数を16進数表現 hhhh に変換します。
|
N/A | ||||||||
u
|
符号なし整数を10進数表現 dddd に変換します。
|
N/A | ||||||||
fF (C99)
|
浮動小数点数を [-]ddd.ddd の形式で10進数表記に変換します。
|
N/A | N/A | double |
double (C99) |
N/A | N/A | N/A | N/A | long double |
eE
|
浮動小数点数を10進指数表記に変換します。
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
aA
(C99) |
浮動小数点数を16進指数表記に変換します。
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
gG
|
浮動小数点数を値と精度に応じて10進数または10進指数表記に変換します。
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
n
|
この関数への呼び出しによってこれまでに書き込まれた文字数を返します。
|
signed char* |
short* |
int* |
long* |
long long* |
※ |
N/A | ||
p
|
ポインタを定義する実装定義の文字シーケンスを書き込みます。 |
N/A | N/A | void* |
N/A | N/A | N/A | N/A | N/A | N/A |
| 注釈 | ||||||||||
|
浮動小数点変換関数は無限大を 非数は 変換 char、 unsigned char、 signed char、 short、および unsigned short を印刷するために使用される変換指定子は、 デフォルト引数プロモーションのプロモートされた型を期待しますが、その値を印刷する前に char、 unsigned char、 signed char、 short、および unsigned short に変換されます。可変関数が呼び出されるときに行われるプロモーションのため、これらの型の値を渡すことは安全です。 固定幅文字型(int8_t など)の正しい変換指定子は、ヘッダー <inttypes.h> で定義されています(ただし、PRIdMAX、PRIuMAX などは メモリ書き込み変換指定子 各変換指定子の処理後にはシーケンスポイントが存在します。これにより、同じ変数に複数の 変換指定子が不正な場合、動作は未定義です。 | ||||||||||
[編集] 返り値
[編集] 注釈
これらの関数はすべて、少なくとも1回 va_arg を呼び出します。 arg の値は、返り値の後には不定です。これらの関数は va_end を呼び出さないため、呼び出し元が実行する必要があります。
vsnprintf_s は、 vsprintf_s とは異なり、結果を buffer が指す配列に収まるように切り捨てます。
Microsoft CRT の vsnprintf_s の実装は、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 vfprintf関数 (p: TBD)
- 7.21.6.10 vprintf関数 (p: TBD)
- 7.21.6.12 vsnprintf関数 (p: TBD)
- 7.21.6.13 vsprintf関数 (p: TBD)
- K.3.5.3.8 vfprintf_s関数 (p: TBD)
- K.3.5.3.10 vprintf_s関数 (p: TBD)
- K.3.5.3.12 vsnprintf_s関数 (p: TBD)
- K.3.5.3.13 vsprintf_s関数 (p: TBD)
- C17標準 (ISO/IEC 9899:2018)
- 7.21.6.8 vfprintf関数 (p: 238)
- 7.21.6.10 vprintf関数 (p: 239)
- 7.21.6.12 vsnprintf関数 (p: 239-240)
- 7.21.6.13 vsprintf関数 (p: 240)
- K.3.5.3.8 vfprintf_s関数 (p: 434)
- K.3.5.3.10 vprintf_s関数 (p: 435)
- K.3.5.3.12 vsnprintf_s関数 (p: 436-437)
- K.3.5.3.13 vsprintf_s関数 (p: 437)
- C11標準 (ISO/IEC 9899:2011)
- 7.21.6.8 vfprintf関数 (p: 326-327)
- 7.21.6.10 vprintf関数 (p: 328)
- 7.21.6.12 vsnprintf関数 (p: 329)
- 7.21.6.13 vsprintf関数 (p: 329)
- K.3.5.3.8 vfprintf_s関数 (p: 597)
- K.3.5.3.10 vprintf_s関数 (p: 598-599)
- K.3.5.3.12 vsnprintf_s関数 (p: 600)
- K.3.5.3.13 vsprintf_s関数 (p: 601)
- C99標準 (ISO/IEC 9899:1999)
- 7.19.6.8 vfprintf関数 (p: 292)
- 7.19.6.10 vprintf関数 (p: 293)
- 7.19.6.12 vsnprintf関数 (p: 294)
- 7.19.6.13 vsprintf関数 (p: 295)
- C89/C90標準 (ISO/IEC 9899:1990)
- 4.9.6.7 vfprintf関数
- 4.9.6.8 vprintf関数
- 4.9.6.9 vsprintf関数
[編集] 関連項目
| (C95)(C95)(C95)(C11)(C11)(C11)(C11) |
stdout、ファイルストリームに書式化されたワイド文字出力を書き出す または可変長引数リストを使用してバッファから (関数) |
| (C99)(C11)(C11)(C11)(C11) |
stdout、ファイルストリーム、またはバッファに書式化された出力を書き出す (関数) |
| (C99)(C99)(C99)(C11)(C11)(C11) |
stdin、ファイルストリーム、またはバッファから書式化された入力を読み込む 可変長引数リストを使用する (関数) |
| C++ ドキュメント ( vprintf, vfprintf, vsprintf, vsnprintf)
| |