sprintf、、_sprintf_lswprintf_swprintf、、_swprintf_l__swprintf_l

將格式化資料寫入字串。 這些函式中有一些更安全的版本可供使用;請參閱 、、swprintf_s_sprintf_s_l、。sprintf_s_swprintf_s_l 的安全版本 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.35000000000000008) 會繼續四捨五入至 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_lfwprintf_fwprintf_l
printf、 、 _printf_lwprintf_wprintf_l
scanf、 、 _scanf_lwscanf_wscanf_l
sscanf、 、 _sscanf_lswscanf_swscanf_l
vprintf 函數