Share via


_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, _snwprintfs _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í NULLznak . 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 printfwprintf 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 na wchar_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. Číslo
Chyba kódování během formátování Pokud se zastaví zpracování specifikátoru sřetězce , Snebo Z, zpracování specifikace formátu. -1 EILSEQ (42) Číslo
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) Číslo
buffer == NULLa a sizeOfBuffer == 0count == 0 Nezapisuje se žádná data. 0 Číslo
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 Číslo
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. Číslo
count < sizeOfBuffer a len <= count Všechna data se zapíšou a připojí se ukončení NULL . Počet zapsaných znaků. Číslo
count < sizeOfBuffer a len > count První count znaky se zapíšou a připojí se ukončení NULL . -1 Číslo
count >= sizeOfBuffer a len < sizeOfBuffer Všechna data jsou zapsána s ukončením NULL. Počet zapsaných znaků. Číslo
count >= sizeOfBuffera a len >= sizeOfBuffercount != _TRUNCATE Pokud provádění pokračuje po spuštění neplatné obslužné rutiny parametru, nastaví errno, sady buffer[0] == NULLa 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 Číslo
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. Číslo
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_errlisterrno_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 Rutinní _UNICODE a _MBCS není definován _MBCS Definovány _UNICODE Definovány
_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