次の方法で共有


vsprintf_vsprintf_lvswprintf_vswprintf_l__vswprintf_l

引数のリストへのポインタを使用して、書式設定された出力を書き込みます。 これらの関数のセキュリティを強化したバージョンを使用できます。「vsprintf_s_vsprintf_s_lvswprintf_s_vswprintf_s_l」を参照してください。

構文

int vsprintf(
   char *buffer,
   const char *format,
   va_list argptr
);
int _vsprintf_l(
   char *buffer,
   const char *format,
   _locale_t locale,
   va_list argptr
);
int vswprintf(
   wchar_t *buffer,
   size_t count,
   const wchar_t *format,
   va_list argptr
);
int _vswprintf_l(
   wchar_t *buffer,
   size_t count,
   const wchar_t *format,
   _locale_t locale,
   va_list argptr
);
int __vswprintf_l(
   wchar_t *buffer,
   const wchar_t *format,
   _locale_t locale,
   va_list argptr
);
template <size_t size>
int vsprintf(
   char (&buffer)[size],
   const char *format,
   va_list argptr
); // C++ only
template <size_t size>
int _vsprintf_l(
   char (&buffer)[size],
   const char *format,
   _locale_t locale,
   va_list argptr
); // C++ only
template <size_t size>
int vswprintf(
   wchar_t (&buffer)[size],
   const wchar_t *format,
   va_list argptr
); // C++ only
template <size_t size>
int _vswprintf_l(
   wchar_t (&buffer)[size],
   const wchar_t *format,
   _locale_t locale,
   va_list argptr
); // C++ only

パラメーター

buffer
出力の保存場所。

count
この関数のワイド文字列バージョンで格納する最大文字数。

format
フォーマット仕様。

argptr
引数のリストへのポインタ。

locale
使用するロケール。

戻り値

vsprintf vswprintf は、書き込まれた文字数 (終端の NULL 文字を含まない) を返すか、出力エラーが発生した場合は負の値を返します。 buffer または formatNULLポインターの場合、これらの関数は「パラメーターの検証」で説明されているように、無効なパラメーター ハンドラーを呼び出します。 実行の続行が許可されている場合、これらの関数は -1 を返し、 errnoEINVAL に設定します。

bufferNULL ポインターで、count が 0 の場合、vswprintf_vswprintf_l は、終端の NULL を含まない文字数を戻します。

buffer が有効で count が 0 の場合、vswprintf_vswprintf_l は -1 を返します。 bufferの内容は変更ありません。

これらのエラー コードとその他のエラー コードの詳細については、「errno」、「_doserrno」、「_sys_errlist」、および「_sys_nerr」を参照してください。

注釈

これらの各関数は、引数リストへのポインターを受け取り、指定されたデータを書式設定して、 buffer が指すメモリに書き込みます。

これらの関数のサフィックスが _l であるバージョンは、現在のスレッド ロケールの代わりに渡された locale パラメーターを使用する点を除いて同じです。

Von Bedeutung

vsprintfを使用すると、書き込まれる文字数を制限する方法がないため、この関数を使用するコードはバッファオーバーランの影響を受けやすくなります。 代わりに _vsnprintf を使用するか、 _vscprintf を呼び出して、必要なバッファーの大きさを判断してください。 また、 format がユーザー定義の文字列でないことを確認してください。 詳細については、「バッファー オーバーランの回避」を参照してください。 Windows 10 バージョン 2004 (ビルド 19041) 以降の printf ファミリの関数では、丸め処理の IEEE 754 の規則に従って、正確に表現可能な浮動小数点数が出力されます。 以前のバージョンの Windows では、"5" で終わる正確に表現可能な浮動小数点数は常に切り上げられていました。 IEEE 754 では、最も近い偶数に丸める ("銀行型丸め" とも呼ばれます) 必要があることが示されています。 たとえば、printf("%1.0f", 1.5)printf("%1.0f", 2.5) の両方を 2 に丸める必要があります。 以前は、1.5 は 2 に、2.5 は 3 に丸められていました。 この変更は、正確に表現可能な数値にのみ影響します。 たとえば、2.35 (メモリで表される場合は 2.35000000000000008 に近い) は、2.4 に切り上げられます。 これらの関数によって実行される丸め処理では、fesetround によって設定された浮動小数点丸めモードにも従うようになりました。 以前は、丸め処理には常に FE_TONEAREST の動作が選択されていました。 この変更は、Visual Studio 2019 バージョン 16.2 以降を使用してビルドされたプログラムにのみ影響します。 従来の浮動小数点丸め動作を使用するには、 'legacy_stdio_float_rounding.obj' でリンクします。

vswprintfISO C 規格に準拠しており、ISO C 規格では、タイプ size_t の 2 番目のパラメーター (count) が必要です。 古い非標準動作を強制するには、 _CRT_NON_CONFORMING_SWPRINTFS を定義します。 古い動作は将来のバージョンにはない可能性があるため、新しい準拠動作を使用するようにコードを変更する必要があります。

C++ では、これらの関数には、これらの関数の新しく安全な対応物を呼び出すテンプレート オーバーロードがあります。 詳細については、「セキュリティ保護されたテンプレート オーバーロード」を参照してください。

汎用テキスト ルーチンのマップ

TCHAR.H ルーチン _UNICODE_MBCS が定義されていない _MBCS が定義されている _UNICODE が定義されている
_vstprintf vsprintf vsprintf vswprintf
_vstprintf_l _vsprintf_l _vsprintf_l _vswprintf_l

要求事項

ルーチンによって返される値 必須ヘッダー 省略可能なヘッダー
vsprintf_vsprintf_l <stdio.h><stdarg.h> <varargs.h>*
vswprintf_vswprintf_l <stdio.h> または <wchar.h>、および <stdarg.h> <varargs.h>*

* UNIX V との互換性のために必要です。

互換性の詳細については、「 互換性」を参照してください。

// crt_vsprintf.c
// compile with: cl /W4 crt_vsprintf.c
// This program uses vsprintf to write to a buffer.
// The size of the buffer is determined by _vscprintf.

#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>

void test( char const * const format, ... )
{
    va_list args;
    int     len;
    char    *buffer;

    // retrieve the variable arguments
    va_start( args, format );

    len = _vscprintf( format, args ) // _vscprintf doesn't count
                                + 1; // terminating '\0'

    buffer = (char*)malloc( len * sizeof(char) );
    if ( 0 != buffer )
    {
        vsprintf( buffer, format, args ); // C4996
        // Note: vsprintf is deprecated; consider using vsprintf_s instead
        puts( buffer );

        free( buffer );
    }
    va_end( args );
}

int main( void )
{
   test( "%d %c %d", 123, '<', 456 );
   test( "%s", "This is a string" );
}
123 < 456
This is a string

こちらも参照ください

ストリーム入出力
vprintf 関数
形式指定構文: printf 関数と wprintf 関数
fprintf_fprintf_lfwprintf_fwprintf_l
printf_printf_lwprintf_wprintf_l
sprintf_sprintf_lswprintf_swprintf_l__swprintf_l
va_argva_copyva_endva_start