Visual Studio 2017 を使用することをお勧めします

snprintf、_snprintf、_snprintf_l、_snwprintf、_snwprintf_l

 

公開日: 2016年10月

Visual Studio 2017 RC の最新のドキュメントの詳細については、Visual Studio 2017 RC ドキュメントをご参照ください。

文字列に書式付きデータを書き込みます。 これらの関数のセキュリティを強化したバージョンを使用できます。「 _snprintf_s, _snprintf_s_l, _snwprintf_s, _snwprintf_s_l」をご覧ください。

int snprintf(  
   char *buffer,  
   size_t count,  
   const char *format [,  
   argument] ...   
);  
int _snprintf(  
   char *buffer,  
   size_t count,  
   const char *format [,  
   argument] ...   
);  
int _snprintf_l(  
   char *buffer,  
   size_t count,  
   const char *format,  
   locale_t locale [,  
   argument] ...   
);  
int _snwprintf(  
   wchar_t *buffer,  
   size_t count,  
   const wchar_t *format [,  
   argument] ...   
);  
int _snwprintf_l(  
   wchar_t *buffer,  
   size_t count,  
   const wchar_t *format,  
   locale_t locale [,  
   argument] ...   
);  
template <size_t size>  
int _snprintf(  
   char (&buffer)[size],  
   size_t count,  
   const char *format [,  
   argument] ...   
); // C++ only  
template <size_t size>  
int _snprintf_l(  
   char (&buffer)[size],  
   size_t count,  
   const char *format,  
   locale_t locale [,  
   argument] ...   
); // C++ only  
template <size_t size>  
int _snwprintf(  
   wchar_t (&buffer)[size],  
   size_t count,  
   const wchar_t *format [,  
   argument] ...   
); // C++ only  
template <size_t size>  
int _snwprintf_l(  
   wchar_t (&buffer)[size],  
   size_t count,  
   const wchar_t *format,  
   locale_t locale [,  
   argument] ...   
); // C++ only  

パラメーター

buffer
出力の格納場所。

count
格納する最大文字数。

format
書式指定文字列。

argument
省略可能な引数。

locale
使用するロケール。

詳細については、次を参照してください。書式指定構文: printf 関数と wprintf 関数します。

以下の説明では、書式付きデータ文字列の長さ (終端の null は含まない) を len とします。 lencount は、 snprintf 関数と _snprintf関数ではバイト単位、 _snwprintf関数ではワイド文字単位になります。

すべての関数の場合はlen < countlen文字が含まれてbuffer、終端の null を追加するとlenが返されます。

snprintf 関数は、 lencount以上の場合、null 終端記号を buffer[count-1]に配置することによって、出力を切り捨てます。 戻り値は lenです。 count のサイズが十分な場合に出力されたであろう文字数です。 snprintf 関数は、エンコード エラーが発生すると負の値を返します。

以外のすべての機能snprintf場合は、 len = countlenで文字が格納されているbuffer、終端の null は追加されず、lenが返されます。 場合len > countcountで文字が格納されているbuffer終端の null は追加されず、負の値が返されます。

buffer が null ポインターで count がゼロの場合、 len は、出力の書式を指定するのに必要な文字数として返されます。終端の null は含まれません。 同じ argument パラメーターおよび locale パラメーターを指定して正常な呼び出しを行うには、少なくとも len + 1 文字を保持するバッファーを割り当てます。

buffer が null ポインターで count が 0 以外の場合、または format が null ポインターの場合は、「 Parameter Validation」をご覧ください。 実行の継続が許可された場合、これらの関数は -1 を返し、 errnoEINVALに設定します。

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

snprintf 関数と、関数の _snprintf ファミリは、 count 以下の文字数を書式指定し、 bufferに格納します。 snprintf 関数は、常に終端の null 文字を格納し、必要に応じて出力を切り捨てます。 関数の _snprintf ファミリは、書式付き文字列の長さが確実に count 文字数未満の場合にのみ、終端の null 文字を追加します。 各 argument (指定されている場合) は、 format中の対応する書式指定に応じて変換され、格納されます。 format は通常の文字で構成し、その形式と機能は format printf 関数のと同じです。 重なり合う文字列間でコピーした場合の動作は未定義です。

System_CAPS_ICON_important.jpg 重要

format にユーザー定義の文字列を指定しないでください。 _snprintf 関数では NULL で終わることが保証されないため (特に戻り値が countの場合)、これらの関数の後に、終端の null を追加するコードが続いていることを確認してください。 詳しくは、「 バッファー オーバーランの回避」をご覧ください。

Visual Studio 2015 および Windows 10 で UCRT と共に開始する場合、 snprintf_snprintfと同一ではなくなります。 snprintf 関数の動作は、現在 C99 標準準拠です。

_snwprintf_snprintf のワイド文字バージョンであり、_snwprintf のポインター引数はワイド文字列です。 _snwprintf_snprintf では、エンコーディング エラーの検出動作が異なる場合があります。 _snwprintf と同様に、swprintf では出力が FILE 型の出力先ではなく文字列に書き込まれます。

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

C++ では、これらの関数にテンプレートのオーバーロードがあります。このオーバーロードは、より安全な新しいバージョンを呼び出します。 詳細については、「 Secure Template Overloads」を参照してください。

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

Tchar.h のルーチン_UNICODE および _MBCS が未定義の場合_MBCS が定義されている場合_UNICODE が定義されている場合
_sntprintf_snprintf_snprintf_snwprintf
_sntprintf_l_snprintf_l_snprintf_l_snwprintf_l
ルーチン必須ヘッダー
snprintf, _snprintf, _snprintf_l<stdio.h>
_snwprintf, _snwprintf_l<stdio.h> または <wchar.h>

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

// crt_snprintf.c  
// compile with: /W3  
#include <stdio.h>  
#include <stdlib.h>  
  
#if !defined(__cplusplus)  
typedef int bool;  
const bool true = 1;  
const bool false = 0;  
#endif  
  
#define FAIL 0 // change to 1 and see what happens  
  
int main(void)  
{  
   char buffer[200];  
   const static char s[] = "computer"  
#if FAIL  
"computercomputercomputercomputercomputercomputercomputercomputer"  
"computercomputercomputercomputercomputercomputercomputercomputer"  
"computercomputercomputercomputercomputercomputercomputercomputer"  
"computercomputercomputercomputercomputercomputercomputercomputer"  
#endif  
   ;  
   const char c = 'l';   
   const int i = 35;  
#if FAIL  
   const double fp = 1e300; // doesn't fit in the buffer  
#else  
   const double fp = 1.7320534;  
#endif  
   /* !subtract one to prevent "squeezing out" the terminal nul! */  
   const int bufferSize = sizeof(buffer)/sizeof(buffer[0]) - 1;  
   int bufferUsed = 0;  
   int bufferLeft = bufferSize - bufferUsed;  
   bool bSuccess = true;  
   buffer[0] = 0;  
  
   /* Format and print various data: */  
  
   if (bufferLeft > 0)  
   {  
      int perElementBufferUsed = _snprintf(&buffer[bufferUsed],   
      bufferLeft, "   String: %s\n", s ); // C4996  
      // Note: _snprintf is deprecated; consider _snprintf_s instead  
      if (bSuccess = (perElementBufferUsed >= 0))  
      {  
         bufferUsed += perElementBufferUsed;  
         bufferLeft -= perElementBufferUsed;  
         if (bufferLeft > 0)  
         {  
            int perElementBufferUsed = _snprintf(&buffer[bufferUsed],   
            bufferLeft, "   Character: %c\n", c ); // C4996  
            if (bSuccess = (perElementBufferUsed >= 0))  
            {  
               bufferUsed += perElementBufferUsed;  
               bufferLeft -= perElementBufferUsed;  
               if (bufferLeft > 0)  
               {  
                  int perElementBufferUsed = _snprintf(&buffer  
                  [bufferUsed], bufferLeft, "   Integer: %d\n", i ); // C4996  
                  if (bSuccess = (perElementBufferUsed >= 0))  
                  {  
                     bufferUsed += perElementBufferUsed;  
                     bufferLeft -= perElementBufferUsed;  
                     if (bufferLeft > 0)  
                     {  
                        int perElementBufferUsed = _snprintf(&buffer  
                        [bufferUsed], bufferLeft, "   Real: %f\n", fp ); // C4996  
                        if (bSuccess = (perElementBufferUsed >= 0))  
                        {  
                           bufferUsed += perElementBufferUsed;  
                        }  
                     }  
                  }  
               }  
            }  
         }  
      }  
   }  
  
   if (!bSuccess)  
   {  
      printf("%s\n", "failure");  
   }  
   else  
   {  
      /* !store nul because _snprintf doesn't necessarily (if the string   
       * fits without the terminal nul, but not with it)!  
       * bufferUsed might be as large as bufferSize, which normally is   
       * like going one element beyond a buffer, but in this case   
       * subtracted one from bufferSize, so we're ok.  
       */  
      buffer[bufferUsed] = 0;  
      printf( "Output:\n%s\ncharacter count = %d\n", buffer, bufferUsed );  
   }  
   return EXIT_SUCCESS;  
}  

Output:  
   String: computer  
   Character: l  
   Integer: 35  
   Real: 1.732053  
  
character count = 69  

ストリーム入出力
sprintf、_sprintf_l、swprintf、_swprintf_l、 __swprintf_l
fprintf、_fprintf_l、fwprintf、_fwprintf_l
printf、_printf_l、wprintf、_wprintf_l
scanf、_scanf_l、wscanf、_wscanf_l
sscanf、_sscanf_l、swscanf、_swscanf_l
vprintf 系関数

表示: