sprintf, _sprintf_l, swprintf, _swprintf, _swprintf_l, __swprintf_l

將格式化資料寫入字串。 這些函式中有一些更安全的版本可供使用;請參閱 、、 swprintf_s_sprintf_s_l_swprintf_s_lsprintf_s 的安全版本 swprintf ,並 _swprintf_l 接受緩衝區的大小作為參數。

語法

int sprintf(
   char *buffer,
   const char *format [,
   argument] ...
);

int _sprintf_l(
   char *buffer,
   const char *format,
   _locale_t locale [,
   argument] ...
);

int swprintf(
   wchar_t *buffer,
   size_t count,
   const wchar_t *format [,
   argument]...
);

int _swprintf(
   wchar_t *buffer,
   const wchar_t *format [,
   argument]...
);

int _swprintf_l(
   wchar_t *buffer,
   size_t count,
   const wchar_t *format,
   _locale_t locale [,
   argument] ...
);

int __swprintf_l(
   wchar_t *buffer,
   const wchar_t *format,
   _locale_t locale [,
   argument] ...
);

template <size_t size>
int sprintf(
   char (&buffer)[size],
   const char *format [,
   argument] ...
); // C++ only

template <size_t size>
int _sprintf_l(
   char (&buffer)[size],
   const char *format,
   _locale_t locale [,
   argument] ...
); // C++ only

參數

buffer
輸出的儲存位置

count
要儲存在此函式的 Unicode 版本中的字元數上限。

format
格式控制字串

argument
選擇性引數

locale
要使用的地區設定。

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

傳回值

寫入的字元數,如果發生錯誤,則為 -1。 如果 bufferformat 為 Null 指標,則會叫用不正確參數處理常式,如參數驗證 中所述 。 如果允許繼續執行,這些函式會傳回 -1,並將 errno 設為 EINVAL

sprintf 會傳回儲存在 buffer中的位元組數目,不計結束的 null 字元。 swprintf 會傳回儲存在 buffer 中的寬字元數目,不計結束的 null 寬字元。

備註

sprintf 函式會在 buffer 中格式化並儲存一連串字元和值。 每個 argument (如果有的話) 是根據 format中的對應格式規格進行轉換和輸出。 此格式包含一般字元,與 printfformat 引數具有相同的形式和功能。 null 字元會附加至最後一個寫入的字元之後。 如果在重疊的字串之間進行複製,則行為是未定義的。

重要

若使用 sprintf,沒有方法可限制寫入的字元數,這表示使用 sprintf 的程式碼很容易發生緩衝區溢位。 請考慮使用相關的函式 _snprintf ,這會指定要寫入 buffer 的字元數上限,或使用 _scprintf 來判斷需要多少緩衝區。 也請確定 format 不是使用者定義的字串。

從 Windows 10 版本 2004(組建 19041)開始,函 printf 式系列會根據 IEEE 754 規則來列印完全可代表的浮點數以進行四捨五入。 在舊版的 Windows 中,完全代表以 '5' 結尾的浮點數一律會四捨五入。 IEEE 754 指出,他們必須四捨五入到最接近的偶數數位(也稱為「銀行家的四捨五入」)。 例如, printf("%1.0f", 1.5) 和 應該 printf("%1.0f", 2.5) 四捨五入為 2。 先前,1.5 會四捨五入為 2,而 2.5 會四捨五入為 3。 這項變更只會影響確切可表示的數位。 例如,2.35 (在記憶體中表示時,其接近 2.3500000000000000008)會繼續四捨五入至 2.4。 這些函式完成的四捨五入現在也會遵守 所 fesetround 設定的浮點舍入模式。 之前,舍入一律選擇 FE_TONEAREST 行為。 這項變更只會影響使用 Visual Studio 2019 16.2 版和更新版本所建置的程式。 若要使用舊版浮點舍入行為,請連結至 'legacy_stdio_float_rounding.obj'

swprintfsprintf的寬字元版本, swprintf 的指標引數是寬字元字串。 中的 swprintf 編碼錯誤偵測可能與 不同 sprintfswprintffwprintf 的行為相同,不同之處在于 swprintf 將輸出寫入字串,而不是型別 的 FILE 目的地,而且 swprintf 需要 count 參數指定要寫入的最大字元數。 這些具有 _l 尾碼的函式版本完全相同,不同之處在于它們會使用傳入的地區設定參數,而不是目前的執行緒地區設定。

在標準化簽 swprintf 章之前,舊版 Microsoft C 執行時間程式庫中未採用字元計數參數的版本。 舊版仍可在 Microsoft C 執行時間程式庫中使用,但已被取代且已 _swprintf() 重新命名。 針對針對舊版簽章撰寫的程式碼,定義 _CRT_NON_CONFORMING_SWPRINTFS ,其會將呼叫對應至 swprintf_swprintf 。 在未來版本中,可能會移除舊的行為,因此應該變更程式碼,以使用新的一致行為。

在 C++ 中,這些函式具有樣板多載,可以叫用這些函式的更新且安全的對應版本。 如需詳細資訊,請參閱 保護範本多載

泛型文字常式對應

TCHAR.H 常規 _UNICODE_MBCS 未定義 _MBCS 定義 _UNICODE 定義
_stprintf sprintf sprintf _swprintf
_stprintf_l _sprintf_l _sprintf_l __swprintf_l

需求

常式 必要的標頭
sprintf, _sprintf_l <stdio.h>
swprintf, _swprintf, _swprintf_l <stdio.h><wchar.h>

如需相容性詳細資訊,請參閱相容性

範例:用來 sprintf 格式化資料

// crt_sprintf.c
// compile with: /W3
// This program uses sprintf to format various
// data and place them in the string named buffer.

#include <stdio.h>

int main( void )
{
   char  buffer[200], s[] = "computer", c = 'l';
   int   i = 35, j;
   float fp = 1.7320534f;

   // Format and print various data:
   j  = sprintf( buffer,     "   String:    %s\n", s ); // C4996
   j += sprintf( buffer + j, "   Character: %c\n", c ); // C4996
   j += sprintf( buffer + j, "   Integer:   %d\n", i ); // C4996
   j += sprintf( buffer + j, "   Real:      %f\n", fp );// C4996
   // Note: sprintf is deprecated; consider using sprintf_s instead

   printf( "Output:\n%s\ncharacter count = %d\n", buffer, j );
}
Output:
   String:    computer
   Character: l
   Integer:   35
   Real:      1.732053

character count = 79

範例:錯誤碼處理

// crt_swprintf.c
// wide character example
// also demonstrates swprintf returning error code
#include <stdio.h>

int main( void )
{
   wchar_t buf[100];
   int len = swprintf( buf, 100, L"%s", L"Hello world" );
   printf( "wrote %d characters\n", len );
   len = swprintf( buf, 100, L"%s", L"Hello\xffff world" );
   // swprintf fails because string contains WEOF (\xffff)
   printf( "wrote %d characters\n", len );
}
wrote 11 characters
wrote -1 characters

另請參閱

資料流 I/O
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 函數