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 arg); |
(5) | (C11以上) |
int vfprintf_s( FILE *restrict stream, const char *restrict format, va_list arg); |
(6) | (C11以上) |
int vsprintf_s( char *restrict buffer, rsize_t bufsz, const char *restrict format, va_list arg); |
(7) | (C11以上) |
int vsnprintf_s(char *restrict buffer, rsize_t bufsz, const char *restrict format, va_list arg); |
(8) | (C11以上) |
vlist によって定義される位置からデータをロードし、それらを文字列に変換し、結果を様々なシンクに書き込みます。
stream に書き込みます。buffer に書き込みます。buffer に書き込みます。 最大 buf_size - 1 文字が書き込まれます。 buf_size がゼロでなければ、結果の文字列はヌル文字で終端されます。 buf_size がゼロの場合は、何も書き込まれず、 buffer はヌルポインタであっても構いませんが、その場合でも戻り値 (本来書き込まれたはずのヌル終端を含まないバイト数) は計算され、返されます。formatに変換指定子%nが存在する。%sに対応するいずれかの引数がヌルポインタ。formatまたはbufferがヌルポインタ。bufszがゼロまたは RSIZE_MAX より大きい。- 文字列または文字変換指定子のいずれかでエンコーディングエラーが発生した。
- (
vsprintf_sの場合のみ)bufferに格納される文字列 (末尾のヌルを含む) がbufszを超える
vprintf_s 、 vfprintf_s、 vsprintf_s および vsnprintf_s は __STDC_LIB_EXT1__ が処理系によって定義されていて、 <stdio.h> をインクルードする前にユーザが __STDC_WANT_LIB_EXT1__ を整数定数 1 に定義した場合にのみ、利用可能であることが保証されます。引数
| stream | - | 書き込む出力ストリーム | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| buffer | - | 書き込む文字列を指すポインタ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| bufsz | - | 最大 bufsz - 1 文字およびヌル終端が書き込まれる可能性があります | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| format | - | データの解釈方法を指定するヌル終端文字列を指すポインタ。
書式文字列は、変更されずに出力ストリームにコピーされる (
以下の書式指定子が利用できます。
浮動小数点変換関数は無限大を 非数は 変換
固定幅の整数型 (int8_t など) に対する正しい変換指定はヘッダ <inttypes.h> で定義されています (PRIdMAX, PRIuMAX などは メモリに書き込む変換指定子 変換指定子それぞれの動作後に副作用完了点があります。 これにより同じ変数に複数の 変換指定が無効な場合、動作は未定義です。
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| vlist | - | 表示するデータを格納している可変長引数リスト | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
戻り値
buf_size 制限のために切り捨てられた場合は、もし制限が課されなければ書き込まれたであろう合計文字数 (終端のヌルバイトは含みません) を返します。buffer に書き込まれた文字数 (ヌル文字はカウントされません。 buffer がヌルポインタでなく、 bufsz がゼロでなく RSIZE_MAX よりも大きくなければ、ヌル文字は常に書き込まれます)。 実行時制約違反の場合はゼロ。 エンコーディングエラーの場合は負の値。bufsz を無視したならば buffer に書き込まれたであろう文字数 (終端のヌル文字は含みません。 buffer がヌルポインタでなく、 bufsz がゼロでなく RSIZE_MAX よりも大きくなければ、ヌル文字は常に書き込まれます)。 実行時制約違反またはエンコーディングエラーが発生した場合は負の値。ノート
これらのすべての関数は va_arg を少なくとも1回は呼び、戻った後 arg の値は不定になります。 これらの関数は va_end を呼ばす、それは呼び出し元が行わなければなりません。
vsnprintf_s は、 vsprintf_s と異なり、結果を buffer の指す配列内に収まるように切り捨てます。
例
#include <stdio.h>
#include <stdarg.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
参考文献
- C11 standard (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 standard (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 standard (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、ファイルストリームまたはバッファから可変個引数リストを使用して書式付き入力を読み取ります (関数) |
vprintf, vfprintf, vsprintf, vsnprintf の C++リファレンス
| |