Sdílet prostřednictvím


sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l

Zapište formátovaná data do řetězce. Tyto funkce jsou verze sprintf, , _sprintf_lswprintf,__swprintf_l_swprintf_ls 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 _snprintftoho 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 Definovány _UNICODE Definovány
_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