vsnprintf_s、vsnwprintf_s

提供: RAD Studio
移動先: 案内検索

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_ss[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;
}

関連項目