vsnprintf_s、vsnwprintf_s
stdio.h:インデックス への移動
ヘッダー ファイル
stdio.h
カテゴリ
書式付き入出力関数
プロトタイプ
int vsnprintf_s(char * restrict s, rsize_t n, const char * restrict format, va_list arg);
int vsnwprintf_s(wchar_t * restrict s, rsize_t n, const wchar_t * restrict format, va_list arg);
説明
vsnprintf、vsnwprintf の代わりとなるもので、セキュリティ機能が強化されています。
vsnprintf_s は、vsnprintf、vsnwprintf と同等のものですが、s および format の妥当性に関する明示的な実行時制約が実装されています。 また、n は 0 ではなく RSIZE_MAX より小さくなければなりません。%s 形式指定子に対応する引数リスト内のすべての引数は、NULL ポインタであってはなりません。
エラーの場合、vnsprintf_s は s[0] に '\0' を設定します。
vsprintf_s、vswprintf_s と異なり、vsnprintf_s は、結果を s が指す配列の長さに切り詰めます。
以下のように、出力するバイト数によって処理が異なります。
- < nsize の場合、文字列の終わりを表す '\0' 文字を含むすべての文字が書き込まれます。
- == nsize の場合、nsize 個の文字が書き込まれ、文字列の終わりを表す '\0' 文字は書き込まれません。
- > nsize の場合、nsize 個の文字だけが書き込まれ、文字列の終わりを表す '\0' 文字は書き込まれません。
nsize が 0 の場合、文字列は書き込まれません(通常は NULL になります)。
戻り値
出力バイト数。nsize が 0 の場合は必要なバイト数。文字列の終わりを表す '\0' は含まれません。
'\0' が書き込まれるのは、戻り値が 0 より大きく n より小さい場合だけです。
例
#include <stdio.h> #include <conio.h> #include <stdarg.h> char buffer[80]; int vspf(char *fmt, ...) { va_list argptr; int cnt; va_start(argptr, fmt); cnt = vsnprintf_s(buffer, 70,fmt, argptr); va_end(argptr); return(cnt); } int main(void) { int inumber = 30; float fnumber = 90.0; char string[4] = "abc"; vspf("%d %f %s", inumber, fnumber, string); printf_s("%s\n", buffer); return 0; }