共用方式為


_snprintf、_snprintf_l、_snwprintf、_snwprintf_l

將格式化資料寫入字串。 這些函式已有更安全的版本可用,請參閱 _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
    要使用的地區設定。

如需詳細資訊,請參閱 格式規格語法:printf 和 wprintf 函式

傳回值

使 len 成為格式化資料字串的長度,不含結束的 null。 len 和 count 對 _snprintf 以位元組為單位,對 _snwprintf 則為寬字元。

如果 len < count,len 字元會儲存於 buffer 中,並會附加 null 結束字元,傳回 len。

如果 len = count,則len 字元會儲存於 buffer 中,不會附加 null 結束字元,並且傳回 len。

如果 len > count,count 字元會儲存於 buffer 中,不會附加 null 結束字元,並且傳回負值。

如果 buffer 為 null 指標,而 count 為零,則會傳回 len 作為格式化輸出所需字元數 (不含結束 null) 計數。 若要使用相同的 argument 和 locale 參數成功呼叫,請至少配置保存 len + 1 個字元的緩衝區。

如果 buffer 為 null 指標,而 count 為非零,或者 format 為 null 指標,則叫用的參數處理常式無效,如 參數驗證 中所述。 如果允許繼續執行,這些函式會傳回 -1,並將 errno 設為 EINVAL。

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

備註

如果格式化的字串長度少於 count 個字元,則 _snprintf 函式會在 buffer 中格式化並儲存 count 或更少的字元數,並且會附加結束 null 字元。 每個 argument (如果有) 皆根據 format 中的對應格式規格進行轉換和輸出。 此格式包含一般字元,與 printf 的 format 引數具有相同的形式和功能。 如果在重疊的字串之間進行複製,則行為是未定義的。

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

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