共用方式為


_snprintf、 _snprintf_l、 _snwprintf、 _snwprintf_l

寫入格式化字串的資料。 這些函式更安全版本都可使用; see _snprintf_s、 _snprintf_s_l、 _snwprintf_s、 _snwprintf_s_l.

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
    若要使用地區設定。

如需詳細資訊,請參閱格式規格

傳回值

讓len是 (不包括結尾的 null) 的格式化的資料字串的長度。 len與count會以位元組為單位的_snprintf,寬字元的_snwprintf。

If len < count然後len字元會儲存在buffer,會加入 null 結束字元,和len會傳回。

如果len = count,然後len字元會儲存在buffer,不會加入任何 null 結束字元,和len會傳回。

If len > count然後count字元會儲存在buffer、 附加 null 結束字元,以及會傳回負數值。

如果buffer是 null 指標和count不是零,或format是空值的指標,不正確的參數處理常式會叫用,如所述參數驗證。 如果執行,則允許繼續執行,這些函數會傳回-1,並設定errno到EINVAL。

如需這些和其他錯誤碼資訊,請參閱 _doserrno、 errno、 _sys_errlist,以及 _sys_nerr

備註

_snprintf函式的格式與儲存區count或更少的字元buffer,並將結束的 null 字元,如果完全是格式化的字串的長度小於count字元。 每個argument (如果有的話) 會轉換並輸出傳送至對應的格式規格,以根據format。 一般字元所組成的格式,與具有相同的表單,並作為format引數的 printf。 如果複製之間的重疊的字串,這個行為未定義。

安全性注意事項安全性提示

請確定format不是使用者定義的字串。因為這個函式並不保證 NULL 終止 (特別是,當傳回的值是count),確保後面新增 null 結束字元的程式碼。如需詳細資訊,請參閱避免緩衝區滿溢,

_snwprintf寬字元版本的_snprintf。 指標引數去_snwprintf是寬字元字串。 偵測編碼中的錯誤_snwprintf可能會有所不同,在_snprintf。 _snwprintf就像swprintf,將輸出字串,而不是目標型別的FILE。

使用這些函式的版本_l尾碼完全相同,不同之處在於它們使用傳遞中而不是目前執行緒的地區設定的地區設定參數。

在 C++ 中,這些函式會有範本的多載,叫用這些函式的較新的、 安全對應項目。 如需詳細資訊,請參閱 安全範本多載

泛用文字常式對應

Tchar.h 常式

_Unicode 之後,未定義的 _MBCS

定義的 _MBCS

定義 _unicode 之後

_sntprintf

_snprintf

_snprintf

_snwprintf

_sntprintf_l

_snprintf_l

_snprintf_l

_snwprintf_l

需求

常式

所需的標頭

_snprintf, _snprintf_l

<stdio.h>

_snwprintf, _snwprintf_l

<stdio.h> 或者 <wchar.h>

如需相容性資訊,請參閱相容性在簡介中。

範例

// 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;
}
  

.NET Framework 對等用法

不適用。 若要呼叫標準的 c 函式,使用PInvoke。 如需詳細資訊,請參閱平台叫用範例

請參閱

參考

資料流 I/O

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 函式