_snprintf_s
, _snprintf_s_l
, , _snwprintf_s
_snwprintf_s_l
Zapisuje formátovaná data do řetězce. Tyto funkce jsou verze snprintf
, , _snprintf
_snprintf_l
, _snwprintf
s _snwprintf_l
vylepšeními zabezpečení popsanými v funkcích zabezpečení v CRT.
Syntaxe
int _snprintf_s(
char *buffer,
size_t sizeOfBuffer,
size_t count,
const char *format [,
argument] ...
);
int _snprintf_s_l(
char *buffer,
size_t sizeOfBuffer,
size_t count,
const char *format,
_locale_t locale [,
argument] ...
);
int _snwprintf_s(
wchar_t *buffer,
size_t sizeOfBuffer,
size_t count,
const wchar_t *format [,
argument] ...
);
int _snwprintf_s_l(
wchar_t *buffer,
size_t sizeOfBuffer,
size_t count,
const wchar_t *format,
_locale_t locale [,
argument] ...
);
template <size_t size>
int _snprintf_s(
char (&buffer)[size],
size_t count,
const char *format [,
argument] ...
); // C++ only
template <size_t size>
int _snwprintf_s(
wchar_t (&buffer)[size],
size_t count,
const wchar_t *format [,
argument] ...
); // C++ only
Parametry
buffer
Umístění úložiště pro výstup
sizeOfBuffer
Velikost umístění úložiště pro výstup Velikost v bajtech pro funkce, které berou char
, a slova pro ty, které berou wchar_t
.
count
Maximální počet znaků k zápisu U funkcí, které přebírají wchar_t
, je maximální počet širokých znaků, které se mají napsat. Nebo _TRUNCATE
.
format
Řetězec řízení formátu
argument
Volitelné argumenty
locale
Národní prostředí, které se má použít
Vrácená hodnota
Počet zapsaných znaků, včetně ukončení NULL
. Pokud dojde k chybě výstupu, vrátí se záporná hodnota. Podrobnosti najdete v souhrnu chování.
Poznámky
Funkce _snprintf_s
formátuje a ukládá count
nebo méně znaků buffer
a připojuje ukončovací NULL
znak . Každý argument (pokud existuje) je převeden a výstup podle odpovídající specifikace formátu v format
. Formátování je konzistentní se printf
sadou funkcí. Viz Syntaxe specifikace formátu a printf
wprintf
funkce. Pokud ke kopírování dojde mezi řetězci, které se překrývají, chování není definováno.
Souhrn chování
Pro následující tabulku:
-Nechte len
velikost formátovaných dat. Pokud funkce vezme char
vyrovnávací paměť, velikost je v bajtech. Pokud funkce vezme wchar_t
vyrovnávací paměť, velikost určuje počet 16bitových slov.
- Znaky odkazují na
char
znaky pro funkce, které přebírajíchar
vyrovnávací paměť, a nawchar_t
znaky pro funkce, které přebírajíwchar_t
vyrovnávací paměť. - Další informace o neplatné obslužné rutině parametru naleznete v tématu Ověření parametru.
Podmínka | Chování | Vrácená hodnota | errno |
Vyvolá neplatnou obslužnou rutinu parametru. |
---|---|---|---|---|
Success | Zapíše znaky do vyrovnávací paměti pomocí zadaného řetězce formátu. | Počet zapsaných znaků, včetně ukončení NULL . |
– | No |
Chyba kódování během formátování | Pokud se zastaví zpracování specifikátoru s řetězce , S nebo Z , zpracování specifikace formátu. |
-1 | EILSEQ (42) |
No |
Chyba kódování během formátování | Pokud specifikátor c znaku zpracování nebo C , je neplatný znak vynechán. Počet zapsaných znaků se pro přeskočený znak nezvýšuje, ani se pro něj nezapisují žádná data. Zpracování specifikace formátu pokračuje po vynechání specifikátoru s chybou kódování. |
Počet zapsaných znaků, včetně ukončení NULL . |
EILSEQ (42) |
No |
buffer == NULL a a sizeOfBuffer == 0 count == 0 |
Nezapisuje se žádná data. | 0 | – | No |
buffer == NULL a buď sizeOfBuffer != 0 nebo count != 0 |
Pokud provádění pokračuje po spuštění neplatné obslužné rutiny parametru, nastaví errno a vrátí zápornou hodnotu. |
-1 | EINVAL (22) |
Ano |
buffer != NULL a sizeOfBuffer == 0 |
Nezapisuje se žádná data. | -1 | EINVAL (22) |
Ano |
count == 0 |
A NULL je umístěn na začátku vyrovnávací paměti. |
-1 | – | No |
count < 0 |
Nebezpečné: Hodnota je považována za nepodepsanou, což pravděpodobně vytvoří velkou hodnotu, která vede k přepsání paměti, která následuje za vyrovnávací pamětí. | Počet zapsaných znaků, včetně ukončení NULL . |
– | No |
count < sizeOfBuffer a len <= count |
Všechna data se zapíšou a připojí se ukončení NULL . |
Počet zapsaných znaků. | – | No |
count < sizeOfBuffer a len > count |
První count znaky se zapíšou a připojí se ukončení NULL . |
-1 | – | No |
count >= sizeOfBuffer a len < sizeOfBuffer |
Všechna data jsou zapsána s ukončením NULL . |
Počet zapsaných znaků. | – | No |
count >= sizeOfBuffer a a len >= sizeOfBuffer count != _TRUNCATE |
Pokud provádění pokračuje po spuštění neplatné obslužné rutiny parametru, nastaví errno , sady buffer[0] == NULL a vrátí zápornou hodnotu. |
-1 | ERANGE (34) |
Ano |
count == _TRUNCATE a len >= sizeOfBuffer |
Zapisuje tolik řetězce, jak se vejde do buffer a ukončuje NULL . |
-1 | – | No |
count == _TRUNCATE a len < sizeOfBuffer |
Zapíše celý řetězec do buffer ukončujícího NULL řetězce . |
Počet zapsaných znaků, včetně ukončení NULL . |
– | No |
format == NULL |
Nezapisuje se žádná data. Pokud provádění pokračuje po spuštění neplatné obslužné rutiny parametru, nastaví errno a vrátí zápornou hodnotu. |
-1 | EINVAL (22) |
Ano |
Informace o těchto a dalších kódech chyb naleznete v tématu , , , a_sys_nerr
. _sys_errlist
errno
_doserrno
Důležité
Ujistěte se, ž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.
_snwprintf_s
je verze širokého znaku _snprintf_s
; argumenty ukazatele na _snwprintf_s
jsou řetězce širokých znaků. Detekce chyb kódování se _snwprintf_s
může lišit od chyby v _snprintf_s
. _snwprintf_s
, například swprintf_s
, zapisuje výstup do řetězce místo do cíle typu FILE
.
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šeno přetíženími šablon; přetížení mohou automaticky odvodit délku vyrovnávací paměti (eliminuje potřebu zadat argument velikosti) a mohou automaticky nahradit starší, nezabezpečené funkce jejich novějšími zabezpečenými protějšky. Další informace naleznete v tématu Přetížení šablon zabezpečení.
Mapování rutin obecného textu
Tchar.h rutina |
_UNICODE a _MBCS není definován |
_MBCS definovaný |
_UNICODE definovaný |
---|---|---|---|
_sntprintf_s |
_snprintf_s |
_snprintf_s |
_snwprintf_s |
_sntprintf_s_l |
_snprintf_s_l |
_snprintf_s_l |
_snwprintf_s_l |
Požadavky
Rutina | Požadovaný hlavičkový soubor |
---|---|
_snprintf_s , _snprintf_s_l |
<stdio.h> |
_snwprintf_s , _snwprintf_s_l |
<stdio.h> nebo <wchar.h> |
Další informace o kompatibilitě najdete v tématu Kompatibilita.
Příklad
// crt_snprintf_s.cpp
// compile with: /MTd
// These #defines enable secure template overloads
// (see last part of Examples() below)
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <crtdbg.h> // For _CrtSetReportMode
#include <errno.h>
// This example uses a 10-byte destination buffer.
int snprintf_s_tester( const char * fmt, int x, size_t count )
{
char dest[10];
printf( "\n" );
if ( count == _TRUNCATE )
printf( "%zd-byte buffer; truncation semantics\n",
_countof(dest) );
else
printf( "count = %zd; %zd-byte buffer\n",
count, _countof(dest) );
int ret = _snprintf_s( dest, _countof(dest), count, fmt, x );
printf( " new contents of dest: '%s'\n", dest );
return ret;
}
void Examples()
{
// formatted output string is 9 characters long: "<<<123>>>"
snprintf_s_tester( "<<<%d>>>", 121, 8 );
snprintf_s_tester( "<<<%d>>>", 121, 9 );
snprintf_s_tester( "<<<%d>>>", 121, 10 );
printf( "\nDestination buffer too small:\n" );
snprintf_s_tester( "<<<%d>>>", 1221, 10 );
printf( "\nTruncation examples:\n" );
int ret = snprintf_s_tester( "<<<%d>>>", 1221, _TRUNCATE );
printf( " truncation %s occur\n", ret == -1 ? "did"
: "did not" );
ret = snprintf_s_tester( "<<<%d>>>", 121, _TRUNCATE );
printf( " truncation %s occur\n", ret == -1 ? "did"
: "did not" );
printf( "\nSecure template overload example:\n" );
char dest[10];
_snprintf( dest, 10, "<<<%d>>>", 12321 );
// With secure template overloads enabled (see #defines
// at top of file), the preceding line is replaced by
// _snprintf_s( dest, _countof(dest), 10, "<<<%d>>>", 12345 );
// Instead of causing a buffer overrun, _snprintf_s invokes
// the invalid parameter handler.
// If secure template overloads were disabled, _snprintf would
// write 10 characters and overrun the dest buffer.
printf( " new contents of dest: '%s'\n", dest );
}
void myInvalidParameterHandler(
const wchar_t* expression,
const wchar_t* function,
const wchar_t* file,
unsigned int line,
uintptr_t pReserved)
{
wprintf(L"Invalid parameter handler invoked: %s\n", expression);
}
int main( void )
{
_invalid_parameter_handler oldHandler, newHandler;
newHandler = myInvalidParameterHandler;
oldHandler = _set_invalid_parameter_handler(newHandler);
// Disable the message box for assertions.
_CrtSetReportMode(_CRT_ASSERT, 0);
Examples();
}
count = 8; 10-byte buffer
new contents of dest: '<<<121>>'
count = 9; 10-byte buffer
new contents of dest: '<<<121>>>'
count = 10; 10-byte buffer
new contents of dest: '<<<121>>>'
Destination buffer too small:
count = 10; 10-byte buffer
Invalid parameter handler invoked: ("Buffer too small", 0)
new contents of dest: ''
Truncation examples:
10-byte buffer; truncation semantics
new contents of dest: '<<<1221>>'
truncation did occur
10-byte buffer; truncation semantics
new contents of dest: '<<<121>>>'
truncation did not occur
Secure template overload example:
Invalid parameter handler invoked: ("Buffer too small", 0)
new contents of dest: ''
Viz také
Vstupně-výstupní operace streamu
sprintf
, _sprintf_l
, swprintf
, , _swprintf_l
__swprintf_l
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