Sdílet prostřednictvím


sprintf, _sprintf_l, swprintf, _swprintf, , _swprintf_l__swprintf_l

Zapište formátovaná data do řetězce. K dispozici jsou bezpečnější verze některých z těchto funkcí; viz sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l. Zabezpečené verze swprintf vyrovnávací paměti a _swprintf_l berou jako parametr velikost vyrovnávací paměti.

Syntaxe

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

Parametry

buffer
Umístění úložiště pro výstup

count
Maximální počet znaků, které se mají uložit ve verzi Unicode této funkce

format
Formátovací řetězec

argument
Volitelné argumenty

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, je vyvolána neplatná obslužná rutina parametru, jak je popsáno v ověření parametru. Pokud je povolené provádění pokračovat, vrátí tyto funkce hodnotu -1 a nastaví errno se na EINVALhodnotu .

sprintf vrátí počet bajtů uložených v buffer, nepočítá ukončující znak null. swprintf 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 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.

Důležité

Použití sprintf, neexistuje způsob, jak omezit počet zapsaných znaků, což znamená, že použití sprintf kódu je náchylné k přetečení vyrovnávací paměti. Zvažte použití související funkce snprintf, která určuje maximální počet znaků pro zápis do buffernebo použít _scprintf k určení, jak velká vyrovnávací paměť je vyžadována. Také se ujistěte, že format není uživatelem definovaný řetězec.

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.

swprintf je verze širokého znaku sprintf; argumenty ukazatele na swprintf jsou řetězce širokých znaků. Detekce chyb kódování se swprintf může lišit od sprintf. swprintf a fwprintf chovají se stejně s výjimkou swprintf zápisu výstupu do řetězce, nikoli do cíle typu FILE, a swprintf vyžaduje count , aby parametr určil maximální počet znaků k zápisu. 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.

Před standardizovaným podpisem swprintf byla verze odeslána ve starší knihovně modulu runtime Microsoft C, která nepřebídala parametr počtu znaků. Starší verze je stále dostupná v knihovně modulu runtime Microsoft C, ale je zastaralá a byla přejmenována _swprintf(). Pro kód, který byl napsán proti staršímu podpisu, definujte _CRT_NON_CONFORMING_SWPRINTFS, který mapuje volání na swprintf_swprintf. V budoucí verzi může být staré chování odebráno, takže kód by měl být změněn tak, aby používal nové vyhovující chování.

V jazyce C++ mají tyto funkce přetížení šablon, které vyvolávají novější zabezpečené protějšky těchto funkcí. Další informace naleznete v tématu Přetížení šablon zabezpečení.

Mapování rutin obecného textu

TCHAR.H Rutinní _UNICODE a _MBCS není definován _MBCS Definovány _UNICODE Definovány
_stprintf sprintf sprintf _swprintf
_stprintf_l _sprintf_l _sprintf_l __swprintf_l

Požadavky

Rutina Požadovaný hlavičkový soubor
sprintf, _sprintf_l <stdio.h>
swprintf, , _swprintf_swprintf_l <stdio.h> nebo <wchar.h>

Další informace o kompatibilitě najdete v tématu Kompatibilita.

Příklad: Použití sprintf k formátování dat

// 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

Příklad: Zpracování kódu chyby

// 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

Viz také

Vstupně-výstupní operace streamu
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 – funkce