vfwprintf()、vswprintf()、vwprintf() - STDARG 引数リストのワイド文字のフォーマット設定および書き込み

標準

標準/拡張機能 C/C++ 依存項目

ISO C 改訂
C99
Single UNIX Specification、バージョン 3
Language Environment

両方  

形式

XPG4:
#include <stdarg.h>
#include <wchar.h>

int vfwprintf(FILE * __restrict__ stream, 
              const wchar_t * __restrict__ format, va_list arg);
int vswprintf(wchar_t * __restrict__ wcs, size_t n, 
              const wchar_t * __restrict__ format, va_list arg);
int vwprintf(const wchar_t * __restrict__ format, va_list arg);

#define _OPEN_SYS_UNLOCKED_EXT 1
#include <wchar.h>

int vfwprintf_unlocked(FILE * __restrict__ stream, 
              const wchar_t * __restrict__ format, va_list arg);
int vwprintf_unlocked(const wchar_t * __restrict__ format, va_list arg);
XPG4:
#define _XOPEN_SOURCE
#define _MSE_PROTOS
#include <stdarg.h>
#include <wchar.h>

int vfwprintf(FILE * __restrict__ stream, 
              const wchar_t * __restrict__ format, va_list arg);
int vswprintf(wchar_t * __restrict__ wcs, size_t n, 
              const wchar_t * __restrict__ format, va_list arg);
int vwprintf(const wchar_t * __restrict__ format, va_list arg);

#define _OPEN_SYS_UNLOCKED_EXT 1
#include <wchar.h>

int vfwprintf_unlocked(FILE * __restrict__ stream, 
              const wchar_t * __restrict__ format, va_list arg);
int vwprintf_unlocked(const wchar_t * __restrict__ format, va_list arg);

機能説明

vfwprintf()、vswprintf()、および vwprintf() の各関数は、次に示す点を除いて、それぞれ fprintf()、sprintf()、および printf() の各関数と同等です。
  • 可変個の引数を指定して呼び出される代わりに、stdarg.h に定義された引数リストを指定して呼び出されます。
  • vswprintf() の場合、引数 wcs は生成された出力が書き込まれる先として、型 char の配列ではなく、型 wchar_t の配列を指定します。
  • 引数 format は以降の引数が出力のために変換される方法を 説明している型 char の配列ではなく、型 wchar_t の配列 を指定します。
  • l 接頭部がない %c は、mbtowc() を呼び出して 変換されたかのように、整数引数が wchar_t に変換されてから、書き込まれることを意味します。
  • l 接頭部がある %c は、wint_twchar_t に変換され てから書き込まれることを意味します。
  • l 接頭部がない %s は、マルチバイトの文字シーケンスを 含む文字配列が wchar_t の配列に変換され、書き込まれることを 意味します。mbrtowc() が繰り返し呼び出されたときのように、変換が行われます。
  • l 接頭部がある %s は、wchar_t の配列が 書き込まれることを意味します。精度に、より短い出力が指定されていない限り、配列は終了 NULL 文字に達するまで (終了 NULL 文字は含まれません) 書き込まれます。

vswprintf() の場合は、NULL ワイド文字が、書き込まれるワイド文字の末尾に書き込まれます。NULL ワイド文字は、戻りの合計の一部として数えられません。オーバーラップした オブジェクト間でコピーが行われた場合には、動作は未定義です。

注: vfwprintf() 関数と vwprintf() 関数は、拡張 ASCII の拡張機能のレベルに依存します。 詳細は、拡張 ASCII サポートを参照してください。

vfwprintf_unlocked() および vwprintf_unlocked() は、 スレッド・セーフでないことを除いて、機能的に vfwprintf() および vwprintf() と 等価です。これらの関数をマルチスレッドのアプリケーション内で安全に使用できるのは、 flockfile() 関数または ftrylockfile() 関数のどちらかへの呼び出しが成功した後のように、 呼び出しスレッドが (FILE*) オブジェクトを所有している間に、これらの関数を呼び出す場合だけです。

XPG4 の特殊な動作: プログラム・ソース・ファイル内の wchar ヘッダーをインクルードするステートメントより前に、XPG4 の動作を指定してフィーチャー・テスト・マクロを定義した場合には、_MSE_PROTOS フィーチャー・テスト・マクロも定義して、プログラムのコンパイル時に使用可能な wchar ヘッダーに、vfwprintf()、vswprintf()、または vwprintf() 関数の宣言を行う必要があります。 XPG4 と他のフィーチャー・テスト・マクロのリストについては、表 1 を参照してください。

戻り値

正常に実行された場合、vfwprintf()、vswprintf()、および vwprintf() は、終了 NULL ワイド文字をカウントに入れずに、書き込まれたワイド文字の数を戻します。

正常に実行されなかった場合は、負の値が戻されます。

n 文字以上のワイド文字の書き込みが要求された場合、vswprintf() は負の値を戻し、errno を設定してエラーを示します。

注: C 言語の一部の UNIX に基づくインプリメンテーションに 対比して、vprintf() ファミリーの z/OS® XL C/C++ インプリメンテーション は変数引数リストを指すポインターを増分します。引数を指すポインターを増やすかどうかを制御するために、vfwprintf()、vswprintf()、または vwprintf() を呼び出すたびにその後に va_end マクロを 呼び出します。

CELEBV06
⁄* CELEBV06 *⁄
#define _XOPEN_SOURCE
#define _MSE_PROTOS
#include <stdio.h>
#include <stdarg.h>
#include <wchar.h>

void vout(wchar_t *, size_t, wchar_t *, ...);

wchar_t *format3 = L"%S %d  %S";
wchar_t *format5 = L"%S  %d  %S  %d  %S";

int main(void)
{
   wchar_t wcstr[100];

   vout(wcstr, 100, format3, L"ONE", 2L, L"THREE");
   printf("%S¥n",wcstr);
   vout(wcstr, 100, format5, L"ONE", 2L, L"THREE", 4L, L"FIVE");
   printf("%S¥n",wcstr);
}

void vout(wchar_t *wcs, size_t n, wchar_t *fmt, ...)
{
   va_list arg_ptr;

   va_start(arg_ptr, fmt);
   if(vswprintf(wcs, n, fmt, arg_ptr)<0)
      perror("vswprintf() error");
   va_end(arg_ptr);
}

関連情報