vswprintf() — バッファーにワイド文字をフォーマットして書き込む
形式
#include <stdarg.h>
#include <wchar.h>
int vswprintf(wchar_t *wcsbuffer, size_t n, const wchar_t
*format, va_list argptr);言語レベル
ANSI
スレッド・セーフ
はい
ロケール依存
この関数の振る舞いは、現行ロケールの LC_CTYPE カテゴリーおよび LC_NUMERIC カテゴリーの影響を受ける可能性があります。 また、LOCALETYPE(*LOCALEUCS2) または LOCALETYPE(*LOCALEUTF) がコンパイル・コマンドに対して指定されている場合は、現行ロケールの LC_UNI_CTYPE カテゴリーおよび LC_UNI_NUMERIC カテゴリーにも影響を受ける可能性があります。 この関数は、コンパイル・コマンドに対して LOCALETYPE(*CLD) が指定されている場合には使用できません。 詳しくは、 CCSID とロケールについてを参照してください。
ワイド文字関数
詳しくは、 ワイド文字 を参照してください。
説明
vswprintf() 関数は、一連のワイド文字と値をフォーマット設定し、バッファー wcsbufferに保管します。 vswprintf() 関数は、 swprintf() 関数と同じように機能します。ただし、 argptr は、呼び出しごとに番号が異なる可能性があるワイド文字引数のリストを指します。 これらの引数は、各呼び出しごとに va_start
で初期化する必要があります。 対照的に、 swprintf() 関数は引数のリストを持つことができますが、そのリスト内の引数の数は、プログラムのコンパイル時に固定されます。
vswprintf() 関数は、フォーマット内の対応するワイド文字フォーマット指定子に従って、引数リスト内の各エントリーを変換します。 フォーマットの形式と機能は、 printf() 関数のフォーマット・ストリングと同じですが、以下の例外があります。- %c (l 接頭部なし) は、
mbtowc()関数を呼び出す場合と同様に、整数引数を wchar_t に変換します。 - %lc は wint_t を wchar_t に変換します。
- %s (l 接頭部なし) は、
mbrtowc()関数を呼び出す場合と同様に、マルチバイト文字の配列を wchar_t の配列に変換します。 この配列は、終了ヌル文字に達するまで書き込まれます (終了ヌル文字自身は書き込まれません) 。ただし、より短い出力が精度に指定されている場合は除きます。 - %ls は wchar_t の配列を書き込みます。 この配列は、終了ヌル文字に達するまで書き込まれます (終了ヌル文字自身は書き込まれません) 。ただし、より短い出力が精度に指定されている場合は除きます。
ヌル・ワイド文字は、書き込まれるワイド文字の末尾に追加されます。 ヌル・ワイド文字は、戻り値の一部として数えられません。 オーバーラップした オブジェクト間でコピーが行われる場合には、振る舞いは予期できません。
戻り値
vswprintf() 関数は、配列に書き込まれたバイト数を戻します。終了ヌル・ワイド文字はカウントしません。
例
vswprintf() を使用してそれらを wcstrに出力する関数 vout() を作成します。#include <stdio.h>
#include <stdarg.h>
#include <wchar.h>
wchar_t *format3 = L"%ls %d %ls";
wchar_t *format5 = L"%ls %d %ls %d %ls";
void vout(wchar_t *wcs, size_t n, wchar_t *fmt, ...)
{
va_list arg_ptr;
va_start(arg_ptr, fmt);
vswprintf(wcs, n, fmt, arg_ptr);
va_end(arg_ptr);
return;
}
int main(void)
{
wchar_t wcstr[100];
vout(wcstr, 100, format3, L"ONE", 2L, L"THREE");
printf("%ls\n", wcstr);
vout(wcstr, 100, format5, L"ONE", 2L, L"THREE", 4L, L"FIVE");
printf("%ls\n", wcstr);
return 0;
}
/************************************************************
The output should be similar to:
ONE 2 THREE
ONE 2 THREE 4 FIVE
************************************************************/