vprintf, vfprintf, vsprintf, vsnprintf, vprintf_s, vfprintf_s, vsprintf_s, vsnprintf_s
| ヘッダ <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 で指定された位置からデータを読み込み、文字列相当に変換し、結果を様々な出力先に書き込みます。
stream に結果を書き込みます。buffer に結果を書き込みます。buffer に結果を書き込みます。最大 bufsz - 1 文字書き込まれます。結果の文字列は、bufsz がゼロでない限り、ヌル文字で終端されます。bufsz がゼロの場合、何も書き込まれず、buffer はヌルポインタでも構いませんが、戻り値(ヌル終端文字を含まない、書き込まれるはずだったバイト数)は依然として計算されて返されます。%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文字 を書き込みます。
|
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 |
intmax_t |
※ |
ptrdiff_t |
N/A |
bB (省略可能)
(C23) |
符号無し整数 を2進表現 bbbb に変換します。
|
unsigned char |
unsigned short |
unsigned int |
unsigned long |
unsigned long long |
uintmax_t |
size_t |
ptrdiff_t |
の符号無しバージョンN/A |
o
|
符号無し整数 を8進表現 oooo に変換します。
|
N/A | ||||||||
xX
|
符号無し整数 を16進表現 hhhh に変換します。
|
N/A | ||||||||
u
|
符号無し整数 を10進表現 dddd に変換します。
|
N/A | ||||||||
fF (C99)
|
浮動小数点数 を10進表記 [-]ddd.ddd に変換します。
|
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* |
intmax_t * |
※ |
ptrdiff_t * |
N/A |
p
|
ポインタ を定義する実装定義の文字シーケンスを書き込みます。 |
N/A | N/A | void* |
N/A | N/A | N/A | N/A | N/A | N/A |
| ノート | ||||||||||
|
浮動小数点変換関数は、無限大を NaN は 変換
固定幅文字型(int8_t など)の正しい変換指定は、ヘッダ <inttypes.h> で定義されています(ただし PRIdMAX、PRIuMAX などは メモリ書き込み変換指定子 各変換指定子の動作の後にはシーケンスポイントがあります。これにより、同じ変数に複数の 変換指定が無効な場合、動作は未定義です。 | ||||||||||
戻り値
buf_size の制限により切り詰められた場合、関数は制限がなかった場合に書き込まれたであろう文字数の合計(終端ヌルバイトを除く)を返します。buffer に書き込まれた文字数(ヌル文字を除く。ただし buffer がヌルポインタではなく、bufsz がゼロでなく、RSIZE_MAX 以下である限り常に書き込まれる)、または実行時制約違反の場合はゼロ、エンコーディングエラーの場合は負の値。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
関連項目
(C95)(C95)(C95)(C11)(C11)(C11)(C11) |
可変引数リストを使用して、stdout、ファイルストリーム 、またはバッファにワイド文字の書式付き出力を出力します (関数) |
(C99)(C11)(C11)(C11)(C11) |
stdout、ファイルストリーム、またはバッファに書式付き出力を出力します (関数) |
(C99)(C99)(C99)(C11)(C11)(C11) |
可変引数リストを使用して、stdin、ファイルストリーム、またはバッファから書式付き入力を読み取ります (関数) |
C++ ドキュメント for vprintf, vfprintf, vsprintf, vsnprintf
| |