vsnprintf、_vsnprintf、_vsnprintf_l、_vsnwprintf、_vsnwprintf_l
更新 : 2007 年 11 月
引数リストへのポインタを使用して、書式付き出力を書き込みます。これらの関数のセキュリティを強化したバージョンについては、「vsnprintf_s、_vsnprintf_s、_vsnprintf_s_l、_vsnwprintf_s、_vsnwprintf_s_l」を参照してください。
int vsnprintf(
char *buffer,
size_t count,
const char *format,
va_list argptr
);
int _vsnprintf(
char *buffer,
size_t count,
const char *format,
va_list argptr
);
int _vsnprintf_l(
char *buffer,
size_t count,
const char *format,
locale_t locale,
va_list argptr
);
int _vsnwprintf(
wchar_t *buffer,
size_t count,
const wchar_t *format,
va_list argptr
);
int _vsnwprintf_l(
wchar_t *buffer,
size_t count,
const wchar_t *format,
locale_t locale,
va_list argptr
);
template <size_t size>
int vsnprintf(
char (&buffer)[size],
size_t count,
const char *format,
va_list argptr
); // C++ only
template <size_t size>
int _vsnprintf(
char (&buffer)[size],
size_t count,
const char *format,
va_list argptr
); // C++ only
template <size_t size>
int _vsnprintf_l(
char (&buffer)[size],
size_t count,
const char *format,
locale_t locale,
va_list argptr
); // C++ only
template <size_t size>
int _vsnwprintf(
wchar_t (&buffer)[size],
size_t count,
const wchar_t *format,
va_list argptr
); // C++ only
template <size_t size>
int _vsnwprintf_l(
wchar_t (&buffer)[size],
size_t count,
const wchar_t *format,
locale_t locale,
va_list argptr
); // C++ only
パラメータ
buffer
出力の格納位置。count
書き込む最大文字数。format
書式の指定。argptr
引数リストへのポインタ。locale
使用するロケール。
戻り値
vsnprintf、_vsnprintf、_vsnwprintf の各関数は、書き込む文字数が count 値以下の場合、書き込まれた文字数を返します。書き込む文字数が count 値を超える場合、これらの関数は -1 を返し、出力が切り捨てられたことを示します。終端の null が書き込まれている場合、その null は戻り値には含まれません。
buffer または format が NULL の場合、または count が 0 以下の場合、これらの関数は、「パラメータの検証」に説明されているように、無効なパラメータ ハンドラを呼び出します。実行の継続が許可された場合、これらの関数は -1 を返し、errno を EINVAL に設定します。
解説
これらの関数は、引数リストへのポインタを使用し、データを書式指定して count 文字数までの文字を buffer が指すメモリに書き込みます。終端に空きがある場合 (つまり、書き込む文字数が count 文字数未満の場合)、バッファは null で終わります。
セキュリティに関するメモ : |
---|
format にユーザー定義の文字列を指定しないでください。詳細については、「Avoiding Buffer Overruns」を参照してください。 |
メモ : |
---|
終端の null 用の空きを確保するために、count を必ずバッファ長未満にし、この関数を呼び出す前にバッファを null に初期化します。 |
vsnprintf 関数は _vsnprintf 関数と同じです。vsnprintf 関数は ANSI 規格に準拠する目的で含まれており、_vnsprintf 関数は下位互換性を保つ目的で保持されています。
_l サフィックスが付いているこれらの関数の各バージョンは、現在のスレッド ロケールの代わりに渡されたロケール パラメータを使用する点を除いて同じです。
C++ では、これらの関数にテンプレートのオーバーロードがあります。このオーバーロードは、これらの関数に対応するセキュリティで保護された新しい関数を呼び出します。詳細については、「セキュリティ保護されたテンプレート オーバーロード」を参照してください。
汎用テキスト ルーチンのマップ
TCHAR.H のルーチン |
_UNICODE および _MBCS が未定義の場合 |
_MBCS が定義されている場合 |
_UNICODE が定義されている場合 |
---|---|---|---|
_vsntprintf |
_vsnprintf |
_vsnprintf |
_vsnwprintf |
_vsntprintf_l |
_vsnprintf_l |
_vsnprintf_l |
_vsnwprintf_l |
必要条件
ルーチン |
必須ヘッダー |
省略可能なヘッダー |
---|---|---|
vsnprintf |
<stdio.h> および <stdarg.h> |
<varargs.h>* |
_vsnprintf, vsnprintf_l |
<stdio.h> および <stdarg.h> |
<varargs.h>* |
_vsnwprintf, _vsnwprintf_l |
<stdio.h> または <wchar.h>、および <stdarg.h> |
<varargs.h>* |
* UNIX V との互換性用
互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。
使用例
// crt_vsnprintf.cpp
// compile with: /W3
#include <stdio.h>
#include <wtypes.h>
void FormatOutput(LPCSTR formatstring, ...)
{
int nSize = 0;
char buff[10];
memset(buff, 0, sizeof(buff));
va_list args;
va_start(args, formatstring);
nSize = vsnprintf( buff, sizeof(buff) - 1, formatstring, args); // C4996
// Note: vsnprintf is deprecated; consider vsnprintf_s instead
printf("nSize: %d, buff: %s\n", nSize, buff);
}
int main() {
FormatOutput("%s %s", "Hi", "there");
FormatOutput("%s %s", "Hi", "there!");
FormatOutput("%s %s", "Hi", "there!!");
}
nSize: 8, buff: Hi there
nSize: 9, buff: Hi there!
nSize: -1, buff: Hi there!
.NET Framework の相当するアイテム
適用できません。標準 C 関数を呼び出すには、PInvoke を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。
参照
参照
fprintf、_fprintf_l、fwprintf、_fwprintf_l
printf、_printf_l、wprintf、_wprintf_l