sprintf_s
, _sprintf_s_l
, , swprintf_s
_swprintf_s_l
Zapište formátovaná data do řetězce. Tyto funkce jsou verze sprintf
, , _sprintf_l
swprintf
, __swprintf_l
_swprintf_l
s vylepšeními zabezpečení, jak je popsáno v funkcích zabezpečení v CRT.
Syntaxe
int sprintf_s(
char *buffer,
size_t sizeOfBuffer,
const char *format,
...
);
int _sprintf_s_l(
char *buffer,
size_t sizeOfBuffer,
const char *format,
_locale_t locale,
...
);
int swprintf_s(
wchar_t *buffer,
size_t sizeOfBuffer,
const wchar_t *format,
...
);
int _swprintf_s_l(
wchar_t *buffer,
size_t sizeOfBuffer,
const wchar_t *format,
_locale_t locale,
...
);
template <size_t size>
int sprintf_s(
char (&buffer)[size],
const char *format,
...
); // C++ only
template <size_t size>
int swprintf_s(
wchar_t (&buffer)[size],
const wchar_t *format,
...
); // C++ only
Parametry
buffer
Umístění úložiště pro výstup
sizeOfBuffer
Maximální počet znaků, které se mají uložit
format
Formátovací řetězec
...
Volitelné argumenty, které se mají formátovat
locale
Národní prostředí, které se má použít
Další informace naleznete v tématu Syntaxe specifikace formátu.
Vrácená hodnota
Počet zapsaných znaků nebo -1, pokud došlo k chybě. Pokud buffer
nebo format
je ukazatel null, sprintf_s
a swprintf_s
vrátit -1 a nastavit errno
na EINVAL
.
sprintf_s
vrátí počet bajtů uložených v buffer
, nepočítá ukončující znak null. swprintf_s
vrátí počet širokých znaků uložených v buffer
, nepočítá ukončující znak s hodnotou null.
Poznámky
Funkce sprintf_s
formátuje a ukládá řadu znaků a hodnot do buffer
. Každý argument
(pokud existuje) je převeden a výstup podle odpovídající specifikace formátu v format
. Formát se skládá z obyčejných znaků a má stejný tvar a funkci jako format
argument pro printf
. Znak null se připojí za poslední zapsaný znak. Pokud ke kopírování dojde mezi řetězci, které se překrývají, chování není definováno.
Jedním z hlavních rozdílů mezi sprintf_s
formátovacím řetězcem a sprintf
je, že sprintf_s
kontroluje platné formátovací znaky, zatímco sprintf
pouze kontroluje, zda formátovací řetězec nebo vyrovnávací paměť jsou NULL
ukazatele. Pokud se některé z kontrol nezdaří, vyvolá se neplatná obslužná rutina parametru, jak je popsáno v ověření parametru. Pokud je spuštění povoleno pokračovat, vrátí funkce hodnotu -1 a nastaví errno
hodnotu EINVAL
.
Dalším hlavním rozdílem mezi sprintf_s
parametrem sprintf
délky, který sprintf_s
určuje velikost výstupní vyrovnávací paměti v znaky. Pokud je vyrovnávací paměť pro formátovaný text příliš malá, včetně ukončující hodnoty null, vyrovnávací paměť je nastavena na prázdný řetězec umístěním znaku null na buffer[0]
a vyvolá se neplatná obslužná rutina parametru. Na rozdíl od _snprintf
toho sprintf_s
zaručuje, že vyrovnávací paměť bude ukončena null, pokud velikost vyrovnávací paměti není nula.
swprintf_s
je verze širokého znaku sprintf_s
; argumenty ukazatele na swprintf_s
jsou řetězce širokých znaků. Detekce chyb kódování se swprintf_s
může lišit od detekce v sprintf_s
. Verze těchto funkcí s příponou _l
jsou shodné s tím rozdílem, že používají parametr národního prostředí předaný místo aktuálního národního prostředí vlákna.
V jazyce C++ je použití těchto funkcí zjednodušené přetíženími šablony. Přetížení mohou odvodit délku vyrovnávací paměti automaticky, což eliminuje potřebu zadat argument velikosti. A můžou automaticky nahradit starší, nezabezpečenější funkce novějšími, bezpečnějšími protějšky. Další informace naleznete v tématu Přetížení šablon zabezpečení.
Existují verze sprintf_s
, které nabízejí větší kontrolu nad tím, co se stane, pokud je vyrovnávací paměť příliš malá. Další informace naleznete v tématu _snprintf_s
, _snprintf_s_l
, _snwprintf_s
, _snwprintf_s_l
.
Důležité
Počínaje Windows 10 verze 2004 (build 19041) printf
vytiskne řada funkcí přesně reprezentovatelná čísla s plovoucí desetinnou čárkou podle pravidel IEEE 754 pro zaokrouhlování. V předchozích verzích Windows by se vždy zaokrouhlila přesně reprezentovatelná čísla s plovoucí desetinnou čárkou končící na 5. IEEE 754 uvádí, že musí zaokrouhlit na nejbližší sudou číslici (označované také jako "Zaokrouhlování bankera"). Například obě printf("%1.0f", 1.5)
a printf("%1.0f", 2.5)
měly by se zaokrouhlit na 2. Dříve by se 1,5 zaokrouhlo na 2 a 2,5 by se zaokrouhlilo na 3. Tato změna má vliv jenom na přesně reprezentovatelná čísla. Například hodnota 2,35 (která je při znázornění v paměti blíže 2,350000000000008) pokračuje zaokrouhlit nahoru na 2,4. Zaokrouhlování provedené těmito funkcemi nyní respektuje také režim zaokrouhlování s plovoucí desetinou čárkou nastavený .fesetround
Dříve bylo zaokrouhlení vždy zvoleno FE_TONEAREST
chování. Tato změna má vliv jenom na programy vytvořené pomocí sady Visual Studio 2019 verze 16.2 a novější. Pokud chcete použít starší chování zaokrouhlení s plovoucí desetinou čárkou, použijte odkaz na legacy_stdio_float_rounding.obj.
Mapování rutin obecného textu
Rutina TCHAR.H | _UNICODE a _MBCS není definován |
_MBCS definovaný |
_UNICODE definovaný |
---|---|---|---|
_stprintf_s |
sprintf_s |
sprintf_s |
swprintf_s |
_stprintf_s_l |
_sprintf_s_l |
_sprintf_s_l |
_swprintf_s_l |
Požadavky
Rutina | Požadovaný hlavičkový soubor |
---|---|
sprintf_s , _sprintf_s_l |
C: <stdio.h> C++: <cstdio> nebo <stdio.h> |
swprintf_s , _swprintf_s_l |
C: <stdio.h> nebo <wchar.h> C++: <cstdio>, <cwchar>, <stdio.h> nebo <wchar.h> |
Další informace o kompatibilitě najdete v tématu Kompatibilita.
Příklad: Použití sprintf_s k formátování dat
// crt_sprintf_s.c
// This program uses sprintf_s 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_s( buffer, 200, " String: %s\n", s );
j += sprintf_s( buffer + j, 200 - j, " Character: %c\n", c );
j += sprintf_s( buffer + j, 200 - j, " Integer: %d\n", i );
j += sprintf_s( buffer + j, 200 - j, " Real: %f\n", fp );
printf_s( "Output:\n%s\ncharacter count = %d\n", buffer, j );
}
Output:
String: computer
Character: l
Integer: 35
Real: 1.732053
character count = 79
Příklad: Zpracování kódu chyby
// crt_swprintf_s.c
// wide character example
// also demonstrates swprintf_s returning error code
#include <stdio.h>
int main( void )
{
wchar_t buf[100];
int len = swprintf_s( buf, 100, L"%s", L"Hello world" );
printf( "wrote %d characters\n", len );
len = swprintf_s( buf, 100, L"%s", L"Hello\xffff world" );
// swprintf_s fails because string contains WEOF (\xffff)
printf( "wrote %d characters\n", len );
}
wrote 11 characters
wrote -1 characters
Viz také
Vstupně-výstupní operace streamu
fprintf
, _fprintf_l
, , fwprintf
_fwprintf_l
printf
, _printf_l
, , wprintf
_wprintf_l
sprintf
, _sprintf_l
, swprintf
, , _swprintf_l
__swprintf_l
scanf
, _scanf_l
, , wscanf
_wscanf_l
sscanf
, _sscanf_l
, , swscanf
_swscanf_l
vprintf
– funkce