Namespaces
Variants

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

From cppreference.net
< c ‎ | io
File input/output
Types and objects
Direct input/output
Formatted output
vwprintf vfwprintf vswprintf vwprintf_s vfwprintf_s vswprintf_s vsnwprintf_s
(C95) (C95) (C95) (C11) (C11) (C11) (C11)
File positioning
Error handling
Operations on files
ヘッダーで定義 <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) と同様であるが、以下のエラーが実行時に検出され、現在インストールされている constraint handler 関数を呼び出す点が異なる:
  • 変換指定子 %n format 内に存在する
  • %s に対応するいずれかの引数がnullポインタである
  • format または buffer がnullポインタである
  • bufsz がゼロまたは RSIZE_MAX / sizeof ( wchar_t ) より大きい
  • 文字列および文字変換指定子でエンコーディングエラーが発生する
  • vswprintf_s のみ)、 buffer に格納される文字列(末尾のワイドナル文字を含む)が bufsz を超える場合
7) (6) と同じですが、結果を buffer が指す配列内に収まるように切り詰めます。
すべての境界チェック付き関数と同様に、 vwprintf_s vfwprintf_s vswprintf_s 、および vsnwprintf_s は、実装によって __STDC_LIB_EXT1__ が定義されており、かつユーザーが <stdio.h> をインクルードする前に __STDC_WANT_LIB_EXT1__ を整数定数 1 に定義している場合にのみ利用可能であることが保証されます。

目次

翻訳のポイント: - 「Contents」を「目次」に翻訳 - HTMLタグ、属性、クラス名は一切変更せず保持 - ` `内のC++関連用語(Parameters、Return value、Notes、Example、References、See also)は原文のまま保持 - 数字や構造は完全に維持 - プロフェッショナルな技術文書としての正確性を確保

パラメータ

stream - 書き込み先の出力ワイドストリーム
buffer - 書き込み先のワイド文字列へのポインタ
bufsz - 書き込む最大ワイド文字数
format - データの解釈方法を指定するnull終端ワイド文字列へのポインタ
vlist - 可変引数リスト 出力するデータを含む


書式文字列は、出力ストリームに変更されずにコピーされる通常のワイド文字( % を除く)と変換指定子で構成されます。各変換指定子は以下の形式を持ちます:

  • 導入 % 文字。
  • (オプション) 変換の動作を変更する1つ以上のフラグ:
  • - : 変換結果がフィールド内で左揃えされます(デフォルトでは右揃え)。
  • + : 符号付き変換の場合、常に符号が変換結果の前に付加されます(デフォルトでは負の場合のみマイナス記号が付きます)。
  • space : 符号付き変換の結果が符号文字で始まらない場合、または空の場合、スペースが結果の前に付加されます。 + フラグが存在する場合は無視されます。
  • # : 変換の 代替形式 が実行されます。正確な効果については以下の表を参照してください。それ以外の場合の動作は未定義です。
  • 0 : 整数および浮動小数点数変換の場合、 space 文字の代わりに先行ゼロを使用してフィールドが埋められます。整数の場合、精度が明示的に指定されている場合は無視されます。このフラグを使用した他の変換の動作は未定義です。 - フラグが存在する場合は無視されます。
  • (オプション) 整数値または * で、最小フィールド幅を指定します。結果は、必要に応じて、右揃えの場合は左側に、左揃えの場合は右側に、 スペース 文字(デフォルト)でパディングされます。 * が使用される場合、幅は int 型の追加引数で指定され、この引数は変換対象の引数と、精度を指定する引数(存在する場合)の前に配置されます。引数の値が負の場合、 - フラグが指定され、正のフィールド幅となります(注: これは最小幅です: 値が切り詰められることはありません。)。
  • (オプション) . に続けて整数値または * を指定するか、あるいは何も指定せずに変換の 精度 を指定する。 * が使用される場合、 精度 int 型の追加引数によって指定され、この引数は変換対象の引数の前に、最小フィールド幅を指定する引数(存在する場合)の後に現れる。この引数の値が負の場合、無視される。数値も * も使用されない場合、精度はゼロと見なされる。 精度 の正確な効果については下記の表を参照のこと。
  • (optional) 長さ修飾子 引数のサイズを指定する(変換形式指定子と組み合わせて、対応する引数の型を指定します)。
  • 変換フォーマット指定子。

以下のフォーマット指定子が利用可能です:

変換
指定子
説明 期待される
引数の型
長さ修飾子→ hh h none 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

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

  • 引数はまず wchar_t に変換されます( btowc を呼び出す場合と同様)。
  • 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

unsigned integer を10進数表現 dddd に変換します。

  • Precision は表示する最小桁数を指定します。
  • デフォルトの精度は 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 です。
  • 代替実装 では、後続する数字がない場合でも小数点が書き込まれます。
  • 無限大および非数の変換スタイルについては notes を参照してください。
N/A N/A N/A N/A N/A N/A
a
A

(C99)

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

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

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

  • g 変換スタイルの場合、 e または f スタイルでの変換が実行されます。
  • G 変換スタイルの場合、 E または f (C99以前) F (C99以降) スタイルでの変換が実行されます。
  • P を、精度が0でない場合はその値、精度が指定されていない場合は 6 、精度が 0 の場合は 1 とします。このとき、 E スタイルでの変換における指数を X とすると:
    • P > X ≥ −4 の場合、変換は f または F (C99以降) スタイルで実行され、精度は P − 1 − X となります。
    • それ以外の場合、変換は e または E スタイルで実行され、精度は P − 1 となります。
  • 代替表現 が要求されない限り、末尾のゼロは削除され、小数部が残っていない場合は小数点も削除されます。
  • 無限大と非数(NaN)の変換スタイルについては 注記 を参照してください。
N/A N/A N/A N/A N/A N/A
n

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

  • 結果は引数が指す値に 書き込まれます
  • 指定子には フラグ フィールド幅 、または 精度 を含めることはできません。
  • z 修飾子の場合、期待される引数の型は S * であり、ここで S size_t の符号付きバージョンです。
signed char *
short *
int *
long *
long long *
該当なし
p

実装定義の文字シーケンスを書き込み、 pointer を定義します。

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 を出力します。

char , unsigned char , signed char , short , および unsigned short を表示するための変換指定子は、 デフォルト引数プロモーション の昇格後の型を期待しますが、表示前にその値は char , unsigned char , signed char , short , および unsigned short に変換されます。可変引数関数が呼び出されるときに行われるプロモーションにより、これらの型の値を渡すことは安全です。

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

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

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

変換指定が無効な場合、動作は未定義です。

戻り値

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

注記

これらの関数はすべて少なくとも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++ドキュメント for vwprintf , vfwprintf , vswprintf