vwprintf, vfwprintf, vswprintf, vwprintf_s, vfwprintf_s, vswprintf_s, vsnwprintf_s
ヘッダ <wchar.h> で定義 | ||
(1) | ||
int vwprintf(constwchar_t*format, va_list vlist ); | (C95以上) (C99未満) | |
int vwprintf(constwchar_t*restrict format, va_list vlist ); | (C99以上) | |
(2) | ||
int vfwprintf(FILE* stream, constwchar_t*format, va_list vlist ); | (C95以上) (C99未満) | |
int vfwprintf(FILE*restrict stream, constwchar_t*restrict format, va_list vlist ); | (C99以上) | |
(3) | ||
int vswprintf(wchar_t*buffer, size_t bufsz, constwchar_t*format, va_list vlist ); | (C95以上) (C99未満) | |
int vswprintf(wchar_t*restrict buffer, size_t bufsz, constwchar_t*restrict format, va_list vlist ); | (C99以上) | |
int vwprintf_s(constwchar_t*restrict format, va_list vlist); | (4) | (C11以上) |
int vfwprintf_s(FILE*restrict stream, constwchar_t*restrict format, va_list vlist); | (5) | (C11以上) |
int vswprintf_s(wchar_t*restrict buffer, rsize_t bufsz, constwchar_t*restrict format, va_list vlist); | (6) | (C11以上) |
int vsnwprintf_s(wchar_t*restrict buffer, rsize_t bufsz, constwchar_t*restrict format, va_list vlist); | (7) | (C11以上) |
vlist
によって定義される位置からデータをロードし、それらをワイド文字列に変換し、結果を様々なシンクに書き込みます。
stream
に書き込みます。buffer
に書き込みます。 最大 bufsz-1 個のワイド文字およびそれに続くヌルワイド文字が書き込まれます。 bufsz
がゼロでなければ、結果のワイド文字列はヌルワイド文字で終端されます。format
に変換指定子%n
が存在する。%s
に対応するいずれかの引数がヌルポインタ。format
またはbuffer
がヌルポインタ。bufsz
がゼロまたはRSIZE_MAX/sizeof(wchar_t)
より大きい。- いずれかの文字列または文字変換指定子でエンコーディングエラーが発生する。
- (
vswprintf_s
の場合のみ)buffer
に格納される文字列 (末尾のワイドヌルを含む) がbufsz
を超える。
buffer
の指す配列に収まるように結果を切り捨てます。 - すべての境界チェック付き関数と同様に、
vwprintf_s
、vfwprintf_s
、vswprintf_s
およびvsnwprintf_s
は __STDC_LIB_EXT1__ が処理系によって定義されていて、<wchar.h>
をインクルードする前にユーザが __STDC_WANT_LIB_EXT1__ を整数定数 1 に定義した場合にのみ、利用可能であることが保証されます。
目次 |
[編集]引数
stream | - | 書き込む出力ファイルストリーム | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
buffer | - | 書き込むワイド文字列を指すポインタ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
bufsz | - | 書き込み最大ワイド文字数 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
format | - | データの解釈方法を指定するヌル終端ワイド文字列を指すポインタ。 書式文字列は、変更されずに出力ストリームにコピーされる (
以下の書式指定子が利用できます。
浮動小数点変換関数は無限大を 非数は 変換
固定幅の整数型 (int8_t など) に対する正しい変換指定はヘッダ <inttypes.h> で定義されています (PRIdMAX, PRIuMAX などは メモリに書き込む変換指定子 %n は、書式文字列がユーザ入力に依存する場合、セキュリティエクスプロイトのよくあるターゲットであり、境界チェック付きの 変換指定子それぞれの動作後に副作用完了点があります。 これにより同じ変数に複数の %n の結果を格納することができ、またエッジケースとして、同じ呼び出しの中で先行する %n によって変更された値を表示することができます。 変換指定が無効な場合、動作は未定義です。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
vlist | - | 表示するデータを格納している可変長引数リスト |
[編集]戻り値
bufsz
の制限のために切り捨てられた場合は、制限が課されなければ書き込まれたであろう合計文字数 (終端のヌルワイド文字は含みません) を返します。buffer
に書き込まれたヌルワイド文字を含まないワイド文字数 (buffer
がヌルポインタでなく、 bufsz
がゼロでなく RSIZE_MAX/sizeof(wchar_t)
より大きくなければ、ヌルワイド文字はは必ず書き込まれます)、実行時制約違反の場合はゼロ、エンコーディングエラーの場合は負の値。bufsz
が無視されたならば buffer
に書き込まれたであろう終端のヌル文字を含まないワイド文字数 (buffer
がヌルポインタでなく、 bufsz
がゼロでなく RSIZE_MAX/sizeof(wchar_t)
より大きくなければ、終端のヌル文字は必ず書き込まれます)、実行時制約違反の場合またはエンコーディングエラーが発生した場合は負の値。[編集]ノート
これらのすべての関数は va_arg を少なくとも1回は呼び、戻った後 arg
の値は不定になります。 これらの関数は va_end を呼ばす、それは呼び出し元が行わなければなりません。
ナロー文字列が要求される出力バッファサイズを調べられる vsnprintf を提供する一方、 (C11 の vsnwprintf_s
までは) ワイド文字列に対する同等な関数はありませんでした。 バッファサイズを決定するためには、 vswprintf
を呼び、結果の値をチェックし、より大きなバッファを確保し直し、成功するまで同様に試みる必要がありました。
vsnwprintf_s
は、 vswprintf_s
と異なり、ほとんどの境界チェック付き関数が切り捨てをエラーとして扱うところ、 buffer
の指す配列内に収まるよう結果を切り捨てます。
[編集]例
#include <stdio.h>#include <time.h>#include <locale.h> void debug_wlog(constwchar_t*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 args; va_start(args, fmt);wchar_t buf[1000];int rc2 = vswprintf(buf, sizeof buf /sizeof*buf, fmt, args); va_end(args); if(rc2 >0)wprintf(L"%s [debug]: %ls\n", time_buf, buf);elsewprintf(L"%s [debug]: (string too long)\n", time_buf);} int main(void){setlocale(LC_ALL, ""); debug_wlog(L"Logging, %d, %d, %d", 1, 2, 3);}
出力例:
02/20/15 22:12:38.476575 UTC [debug]: Logging, 1, 2, 3
[編集]参考文献
- C11 standard (ISO/IEC 9899:2011):
- 7.29.2.5 The vfwprintf function (p: 417-418)
- 7.29.2.7 The vswprintf function (p: 419)
- 7.29.2.9 The vwprintf function (p: 420)
- K.3.9.1.6 The vfwprintf_s function (p: 632)
- K.3.9.1.8 The vsnwprintf_s function (p: 633-634)
- K.3.9.1.9 The vswprintf_s function (p: 634-635)
- K.3.9.1.11 The vwprintf_s function (p: 636)
- C99 standard (ISO/IEC 9899:1999):
- 7.24.2.5 The vfwprintf function (p: 363)
- 7.24.2.7 The vswprintf function (p: 364)
- 7.24.2.9 The vwprintf function (p: 365)
[編集]関連項目
(C99)(C11)(C11)(C11)(C11) | stdout、ファイルストリームまたはバッファに可変個引数リストを使用して書式付き出力を書き出します (関数) |
(C95)(C95)(C95)(C11)(C11)(C11)(C11) | stdout、ファイルストリームまたはバッファに書式付きワイド文字出力を書き出します (関数) |
vwprintf, vfwprintf, vswprintf の C++リファレンス |