Sdílet prostřednictvím


vsnprintf_s, _vsnprintf_s, _vsnprintf_s_l, _vsnwprintf_s, _vsnwprintf_s_l

Zapíše formátovaný výstup pomocí ukazatele na seznam argumentů. Tyto funkce jsou verze vsnprintf, , _vsnprintf_vsnprintf_l,_vsnwprintf_l_vsnwprintfs vylepšeními zabezpečení, jak je popsáno v funkcích zabezpečení v CRT.

Syntaxe

int vsnprintf_s(
   char *buffer,
   size_t sizeOfBuffer,
   size_t count,
   const char *format,
   va_list argptr
);

int _vsnprintf_s(
   char *buffer,
   size_t sizeOfBuffer,
   size_t count,
   const char *format,
   va_list argptr
);

int _vsnprintf_s_l(
   char *buffer,
   size_t sizeOfBuffer,
   size_t count,
   const char *format,
   _locale_t locale,
   va_list argptr
);

int _vsnwprintf_s(
   wchar_t *buffer,
   size_t sizeOfBuffer,
   size_t count,
   const wchar_t *format,
   va_list argptr
);

int _vsnwprintf_s_l(
   wchar_t *buffer,
   size_t sizeOfBuffer,
   size_t count,
   const wchar_t *format,
   _locale_t locale,
   va_list argptr
);

template <size_t size>
int _vsnprintf_s(
   char (&buffer)[size],
   size_t count,
   const char *format,
   va_list argptr
); // C++ only

template <size_t size>
int _vsnwprintf_s(
   wchar_t (&buffer)[size],
   size_t count,
   const wchar_t *format,
   va_list argptr
); // C++ only

Parametry

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

sizeOfBuffer
Velikost výstupu buffer 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, který neobsahuje ukončování NULL. Pro funkce, které berou wchar_t, je počet širokých znaků, které se mají napsat. Nebo _TRUNCATE.

format
Specifikace formátu

argptr
Ukazatel na seznam argumentů

locale
Národní prostředí, které se má použít při formátování výstupu.

Další informace naleznete v tématu Specifikace formátu.

Vrácená hodnota

Počet zapsaných znaků, které neobsahují ukončení NULLnebo zápornou hodnotu, pokud dojde k chybě výstupu.

Podrobnosti najdete v souhrnu chování.

Poznámky

vsnprintf_s je shodný _vsnprintf_s se standardem ANSI a je součástí souladu se standardem ANSI. _vnsprintf je zachována kvůli zpětné kompatibilitě.

Každá z těchto funkcí přebírá ukazatel na seznam argumentů, pak formátuje a zapisuje count znaky daných dat do paměti, na kterou buffer odkazuje, a připojí ukončující hodnotu null.

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.

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ů Čí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. 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
count == 0 Nezapisuje žádná data a vrací počet znaků, které by byly zapsány, a nezahrnuje ukončení NULL. Počet znaků, které by nebyly zapsány, včetně ukončení NULL. Čí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 jsou napsány. -1 Číslo
count >= sizeOfBuffer a len < sizeOfBuffer Všechna data jsou zapsána s ukončením NULL. Počet zapsaných znaků, včetně ukončení NULL. Čí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 buffer, včetně ukončování NULL. -1 Číslo
count == _TRUNCATE a len < sizeOfBuffer Zapíše celý řetězec do buffer ukončování NULL. Počet znaků zapsaných Čí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. Další informace najdete v tématu Zabránění přetečení vyrovnávací paměti. 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".

Poznámka

Chcete-li zajistit, že je k dispozici místo pro ukončení null, ujistěte se, že count je přísně menší než délka vyrovnávací paměti, nebo použijte _TRUNCATE.

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í.

Tip

Pokud se zobrazí nedefinovaná externí _vsnprintf_s chyba a používáte Univerzální modul C Runtime, přidejte legacy_stdio_definitions.lib do sady knihoven, které chcete propojit. Univerzální modul runtime jazyka C neexportuje tuto funkci přímo a místo toho je definovaná jako vložená .<stdio.h> Další informace najdete v tématu Přehled potenciálních problémů s upgradem a změn shody sady Visual Studio 2015.

Mapování rutin obecného textu

TCHAR.H Rutinní _UNICODE a _MBCS není definován _MBCS Definovány _UNICODE Definovány
_vsntprintf_s _vsnprintf_s _vsnprintf_s _vsnwprintf_s
_vsntprintf_s_l _vsnprintf_s_l _vsnprintf_s_l _vsnwprintf_s_l

Požadavky

Rutina Požadovaný hlavičkový soubor Volitelná záhlaví
vsnprintf_s <stdio.h> a <stdarg.h> <varargs.h>*
_vsnprintf_s, _vsnprintf_s_l <stdio.h> a <stdarg.h> <varargs.h>*
_vsnwprintf_s, _vsnwprintf_s_l <stdio.h> nebo <wchar.h>, a <stdarg.h> <varargs.h>*

* Požadováno pro kompatibilitu systém UNIX V.

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

Příklad

// crt_vsnprintf_s.cpp
#include <stdio.h>
#include <wtypes.h>

void FormatOutput(LPCSTR formatstring, ...)
{
   int nSize = 0;
   char buff[10];
   memset(buff, 0, sizeof(buff));
   va_list args;
   va_start(args, formatstring);
   nSize = vsnprintf_s( buff, _countof(buff), _TRUNCATE, formatstring, args);
   printf("nSize: %d, buff: %s\n", nSize, buff);
   va_end(args);
}

int main() {
   FormatOutput("%s %s", "Hi", "there");
   FormatOutput("%s %s", "Hi", "there!");
   FormatOutput("%s %s", "Hi", "there!!");
}
nSize: 8, buff: Hi there
nSize: 9, buff: Hi there!
nSize: -1, buff: Hi there!

Viz také

Vstupně-výstupní operace streamu
vprintf – funkce
fprintf, _fprintf_l, fwprintf, _fwprintf_l
printf, _printf_l, wprintf, _wprintf_l
sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l
va_arg, va_copy, va_end, va_start