vprintf, vfprintf, vsprintf, vsnprintf, vprintf_s, vfprintf_s, vsprintf_s, vsnprintf_s
ヘッダ <stdio.h> で定義 | ||
(1) | ||
int vprintf(constchar*format, va_list vlist ); | (C99未満) | |
int vprintf(constchar*restrict format, va_list vlist ); | (C99以上) | |
(2) | ||
int vfprintf(FILE*stream, constchar*format, va_list vlist ); | (C99未満) | |
int vfprintf(FILE*restrict stream, constchar*restrict format, va_list vlist ); | (C99以上) | |
(3) | ||
int vsprintf(char*buffer, constchar*format, va_list vlist ); | (C99未満) | |
int vsprintf(char*restrict buffer, constchar*restrict format, va_list vlist ); | (C99以上) | |
int vsnprintf(char*restrict buffer, size_t bufsz, constchar*restrict format, va_list vlist ); | (4) | (C99以上) |
int vprintf_s(constchar*restrict format, va_list arg); | (5) | (C11以上) |
int vfprintf_s(FILE*restrict stream, constchar*restrict format, va_list arg); | (6) | (C11以上) |
int vsprintf_s(char*restrict buffer, rsize_t bufsz, constchar*restrict format, va_list arg); | (7) | (C11以上) |
int vsnprintf_s(char*restrict buffer, rsize_t bufsz, constchar*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 などは メモリに書き込む変換指定子 %n は、書式文字列がユーザ入力に依存する場合、セキュリティエクスプロイトのよくあるターゲットであり、境界チェック付きの 変換指定子それぞれの動作後に副作用完了点があります。 これにより同じ変数に複数の %n の結果を格納することができ、またエッジケースとして、同じ呼び出しの中で先行する %n によって変更された値を表示することができます。 変換指定が無効な場合、動作は未定義です。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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(constchar*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++リファレンス |