名前空間
変種
操作

vwprintf, vfwprintf, vswprintf, vwprintf_s, vfwprintf_s, vswprintf_s, vsnwprintf_s

From cppreference.com
< c‎ | io
 
 
ファイル入出力
型とオブジェクト
        
関数
ファイルアクセス
(C95)
非書式化入出力
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

書式付き入力
直接入出力
書式付き出力
vwprintfvfwprintfvswprintfvwprintf_svfwprintf_svswprintf_svsnwprintf_s
(C95)(C95)(C95)(C11)(C11)(C11)(C11)
ファイルポジショニング
エラーハンドリング
ファイル操作
 
ヘッダー <wchar.h> で定義
(1)
int vwprintf( const wchar_t* format, va_list vlist );
(C95 以降)
(C99まで)
int vwprintf( const wchar_t* restrict format, va_list vlist );
(C99以降)
(2)
int vfwprintf( FILE* stream, const wchar_t* format, va_list vlist );
(C95 以降)
(C99まで)
int vfwprintf( FILE* restrict stream,
               const wchar_t* restrict format, va_list vlist );
(C99以降)
(3)
int vswprintf( wchar_t* buffer, size_t bufsz,
               const wchar_t* format, va_list vlist );
(C95 以降)
(C99まで)
int vswprintf( wchar_t* restrict buffer, size_t bufsz,
               const wchar_t* restrict format, va_list vlist );
(C99以降)
int vwprintf_s( const wchar_t* restrict format, va_list vlist);
(4) (C11 以降)
int vfwprintf_s( FILE* restrict stream,
                 const wchar_t* restrict format, va_list vlist);
(5) (C11 以降)
int vswprintf_s( wchar_t* restrict buffer, rsize_t bufsz,
                 const wchar_t* restrict format, va_list vlist);
(6) (C11 以降)
int vsnwprintf_s( wchar_t* restrict buffer, rsize_t bufsz,
                  const wchar_t* restrict format, va_list vlist);
(7) (C11 以降)

vlistによって定義された場所からデータをロードし、それらをワイド文字列の等価物に変換して、結果をさまざまなシンクに書き込みます。

1) 結果をstdoutに書き込みます。
2) 結果をファイルストリームstreamに書き込みます。
3) 結果をワイド文字列bufferに書き込みます。最大bufsz - 1個のワイド文字が書き込まれ、その後にヌルワイド文字が続きます。bufszがゼロでない限り、結果のワイド文字列はヌルワイド文字で終端されます。
4-6) (1-3)と同じですが、次のエラーが実行時に検出され、現在インストールされている制約ハンドラ関数が呼び出されます。
  • format に変換指定子 %n が存在する場合
  • %s に対応する引数がヌルポインタの場合
  • formatまたはbufferがヌルポインタである
  • bufszがゼロまたはRSIZE_MAX / sizeof(wchar_t)より大きい
  • 文字列および文字変換指定子でエンコーディングエラーが発生した場合
  • (vswprintf_sのみ) bufferに格納される文字列(後続のワイドヌルを含む)がbufszを超える。
7) (6)と同じですが、bufferが指す配列に収まるように結果を切り捨てます。
すべての境界チェック付き関数と同様に、vwprintf_svfwprintf_svswprintf_s、およびvsnwprintf_sは、実装によって__STDC_LIB_EXT1__が定義されており、ユーザーが__STDC_WANT_LIB_EXT1__を整数定数1として定義している場合にのみ利用可能であることが保証されます。<stdio.h>をインクルードする前。

目次

[編集] パラメータ

stream - 書き込み先の出力ワイドストリーム
buffer - 書き込み先のワイド文字列へのポインタ
bufsz - 書き込むワイド文字の最大数
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

単一の文字を書き込みます。

  • 引数は、まずbtowcを呼び出すかのようにwchar_tに変換されます。
  • l修飾子を使用する場合、wint_t引数はまずwchar_tに変換されます。
N/A N/A
int
wint_t
N/A N/A N/A N/A N/A
s

文字列を書き込みます。

  • 引数は、初期シフト状態のマルチバイト文字シーケンスを含む文字配列の最初の要素へのポインタである必要があります。これは、ゼロ初期化された変換状態でのmbrtowcの呼び出しとみなして、ワイド文字配列に変換されます。
  • 精度は、書き込むワイド文字の最大数を示します。精度が指定されていない場合、最初のヌル終端文字までのすべてのワイド文字(ヌル終端文字を除く)を書き込みます。
  • l指定子が使用されている場合、引数はwchar_tの配列の最初の要素へのポインタである必要があります。
N/A N/A
char*
wchar_t*
N/A N/A N/A N/A N/A
d
i

符号付き整数を10進数表現 [-]dddd に変換します。

  • 精度は、出現する最小桁数を指定します。デフォルトの精度は 1 です。
  • 変換された値と精度の両方が 0 の場合、変換は文字を生成しません。
  • z 修飾子の場合、期待される引数型は size_t の符号付きバージョンです。
signed char
short
int
long
long long
N/A
o

符号なし整数を8進数表現 oooo に変換します。

  • 精度は、出現する最小桁数を指定します。デフォルトの精度は 1 です。
  • 変換された値と精度の両方が 0 の場合、変換は文字を生成しません。
  • 代替実装では、精度は必要に応じて、1 つの先行ゼロを書き込むために増やされます。その場合、変換された値と精度が両方とも 0 の場合、単一の 0 が書き込まれます。
unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long
ptrdiff_t の符号付きバージョン。
N/A
x
X

符号なし整数を16進数表現 hhhh に変換します。

  • x 変換文字には abcdef が使用されます。
  • X 変換文字には ABCDEF が使用されます。
  • 精度は、出現する最小桁数を指定します。デフォルトの精度は 1 です。
  • 変換された値と精度の両方が 0 の場合、変換は文字を生成しません。
  • 代替実装では、変換された値がゼロ以外の場合、結果に 0x または 0X がプレフィックスとして付けられます。
N/A
u

符号なし整数を10進数表現 dddd に変換します。

  • 精度は表示される最小桁数を指定します。
  • デフォルトの精度は 1 です。
  • 変換された値と精度の両方が 0 の場合、変換は文字を生成しません。
N/A
f
F (C99)

浮動小数点数[-]ddd.ddd の形式で10進数表記に変換します。

  • 精度は小数点文字の後に表示される桁の厳密な数を指定します。
  • デフォルトの精度は 6 です。
  • 代替実装では、小数点文字の後に桁がない場合でも小数点文字が書き込まれます。
  • 無限大および非数変換のスタイルについては注釈を参照してください。
N/A N/A
double
double (C99)
N/A N/A N/A N/A
long double
e
E

浮動小数点数を10進指数表記に変換します。

  • e 変換スタイルには [-]d.ddd e±dd が使用されます。
  • E 変換スタイルには [-]d.ddd E±dd が使用されます。
  • 指数は少なくとも2桁を含み、必要な場合にのみそれ以上の桁が使用されます。
  • 値が 0 の場合、指数も 0 です。
  • 精度は小数点文字の後に表示される桁の厳密な数を指定します。
  • デフォルトの精度は 6 です。
  • 代替実装では、小数点文字の後に桁がない場合でも小数点文字が書き込まれます。
  • 無限大および非数変換のスタイルについては注釈を参照してください。
N/A N/A N/A N/A N/A N/A
a
A

(C99)

浮動小数点数を16進指数表記に変換します。

  • a 変換スタイルには [-] 0xh.hhh p±d が使用されます。
  • A 変換スタイルには [-] 0Xh.hhh P±d が使用されます。
  • 引数が正規化された浮動小数点値の場合、最初の16進数字は 0 ではありません。
  • 値が 0 の場合、指数も 0 です。
  • 精度は16進小数点文字の後に表示される桁の厳密な数を指定します。
  • デフォルトの精度は値の正確な表現に十分です。
  • 代替実装では、小数点文字の後に桁がない場合でも小数点文字が書き込まれます。
  • 無限大および非数変換のスタイルについては注釈を参照してください。
N/A N/A N/A N/A N/A N/A
g
G

浮動小数点数を値と精度に応じて10進数または10進指数表記に変換します。

  • g 変換スタイルでは、スタイル e または f で変換が実行されます。
  • G 変換スタイルでは、E または f(until C99)F(since C99) スタイルの変換が実行されます。
  • P を精度(ゼロでない場合)、指定されない場合は 6、精度が 0 の場合は 1 とします。次に、スタイル E での変換が指数 X を持つ場合
    • P > X ≥ −4 の場合、変換はスタイル f または F(since C99) および精度 P − 1 − X で行われます。
    • それ以外の場合、スタイル e または E、精度 P − 1 で変換します。
  • 代替表現が要求されない限り、後続のゼロは削除され、小数部分が残らない場合は小数点文字も削除されます。
  • 無限大および非数変換のスタイルについては注釈を参照してください。
N/A N/A N/A N/A N/A N/A
n

この関数への呼び出しによってこれまでに書き込まれた文字数を返します。

  • 結果は引数が指す値に書き込まれます
  • 指定子には、フラグフィールド幅、または精度を含めることはできません。
  • z 修飾子の場合、期待される引数型は S* です。ここで Ssize_t の符号付きバージョンです。
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
注釈

浮動小数点変換関数は無限大を inf または infinity に変換します。どちらが使用されるかは実装定義です。

非数は nan または nan(char_sequence) に変換されます。どちらが使用されるかは実装定義です。

変換 F, E, G, A は代わりに INF, INFINITY, NAN を出力します。

charunsigned charsigned charshort、およびunsigned shortを印刷するために使用される変換指定子は、デフォルト引数プロモーションの昇格された型を期待しますが、その値を印刷する前にcharunsigned charsigned charshort、およびunsigned shortに変換されます。可変関数が呼び出されるときに発生する昇格のため、これらの型の値を渡すことは安全です。

固定幅文字型(int8_t など)の正しい変換指定子は、ヘッダー <inttypes.h> で定義されています(ただし、PRIdMAXPRIuMAX などは %jd%ju などと同義です)。

メモリ書き込み変換指定子 %n は、フォーマット文字列がユーザー入力に依存するセキュリティ脆弱性の一般的なターゲットであり、境界チェック付き printf_s ファミリではサポートされていません(since C11)

各変換指定子の処理後にはシーケンスポイントが存在します。これにより、同じ変数に複数の %n の結果を格納したり、エッジケースとして、同じ呼び出し内の以前の %n によって変更された文字列を印刷したりすることが可能になります。

変換指定子が不正な場合、動作は未定義です。

[編集] 戻り値

1,4) 成功した場合は書き込まれたワイド文字数、エラーが発生した場合は負の値。
3) 成功した場合は書き込まれたワイド文字数、エラーが発生した場合は負の値。結果の文字列がbufszの制限により切り捨てられた場合、関数は、制限が課されなかった場合に書き込まれたであろう文字の合計数(終端のヌルワイド文字を除く)を返します。
2,5) 出力ストリームに送信されたワイド文字数、または出力エラー、実行時制約違反エラー、またはエンコーディングエラーが発生した場合は負の値。
6) bufferに書き込まれたワイド文字数(ヌルワイド文字を除く。これは、bufferがヌルポインタではなく、bufszがゼロでもなく、RSIZE_MAX/sizeof(wchar_t)より大きくもない限り常に書き込まれます)、または実行時制約違反の場合はゼロ、エンコーディングエラーの場合は負の値。
7) bufferに書き込まれたであろうワイド文字数(終端のヌル文字を除く。これは、bufferがヌルポインタではなく、bufszがゼロでもなく、RSIZE_MAX/sizeof(wchar_t)より大きくもない限り常に書き込まれます)。bufszが無視された場合。実行時制約違反またはエンコーディングエラーが発生した場合は負の値。

[編集] 注記

これらの関数はすべて、少なくとも1回va_argを呼び出します。戻り後のargの値は不定です。これらの関数はva_endを呼び出さないため、呼び出し元が実行する必要があります。

ナロー文字列には必要な出力バッファサイズを決定できるvsnprintfがありますが、ワイド文字列には同等のもの(C11のvsnwprintf_sまで)はありません。バッファサイズを決定するために、プログラムはvswprintfを呼び出し、戻り値を確認し、より大きなバッファを再割り当てして、成功するまで再試行する必要がある場合があります。

vsnwprintf_sは、vswprintf_sとは異なり、結果をbufferが指す配列に収まるように切り捨てます。これは、ほとんどの境界チェック付き関数では切り捨てがエラーとして扱われるにもかかわらずです。

[編集]

#include <locale.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <wchar.h>
 
void debug_wlog(const wchar_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[1024];
    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);
    else
       wprintf(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

[編集] 参考文献

  • C23標準 (ISO/IEC 9899:2024)
  • 7.29.2.5 vfwprintf 関数 (p: TBD)
  • 7.29.2.7 vswprintf 関数 (p: TBD)
  • 7.29.2.9 vwprintf 関数 (p: TBD)
  • K.3.9.1.6 vfwprintf_s 関数 (p: TBD)
  • K.3.9.1.8 vsnwprintf_s 関数 (p: TBD)
  • K.3.9.1.9 vswprintf_s 関数 (p: TBD)
  • K.3.9.1.11 vwprintf_s 関数 (p: TBD)
  • C17標準 (ISO/IEC 9899:2018)
  • 7.29.2.5 vfwprintf 関数 (p: TBD)
  • 7.29.2.7 vswprintf 関数 (p: TBD)
  • 7.29.2.9 vwprintf 関数 (p: TBD)
  • K.3.9.1.6 vfwprintf_s 関数 (p: TBD)
  • K.3.9.1.8 vsnwprintf_s 関数 (p: TBD)
  • K.3.9.1.9 vswprintf_s 関数 (p: TBD)
  • K.3.9.1.11 vwprintf_s 関数 (p: TBD)
  • C11標準 (ISO/IEC 9899:2011)
  • 7.29.2.5 vfwprintf 関数 (p: 417-418)
  • 7.29.2.7 vswprintf 関数 (p: 419)
  • 7.29.2.9 vwprintf 関数 (p: 420)
  • K.3.9.1.6 vfwprintf_s 関数 (p: 632)
  • K.3.9.1.8 vsnwprintf_s 関数 (p: 633-634)
  • K.3.9.1.9 vswprintf_s 関数 (p: 634-635)
  • K.3.9.1.11 vwprintf_s 関数 (p: 636)
  • C99標準 (ISO/IEC 9899:1999)
  • 7.24.2.5 vfwprintf 関数 (p: 363)
  • 7.24.2.7 vswprintf 関数 (p: 364)
  • 7.24.2.9 vwprintf 関数 (p: 365)

[編集] 関連項目

stdout、ファイルストリーム、またはバッファに書式化された出力を書き出す
可変長引数リストを使用する
(関数) [編集]
stdout、ファイルストリーム、またはバッファに書式化されたワイド文字出力を書き出す
(関数) [編集]
C++ ドキュメント (vwprintfvfwprintfvswprintf)
English 日本語 中文(简体) 中文(繁體)