Sdílet prostřednictvím


vsprintf, _vsprintf_l, vswprintf, _vswprintf_l, __vswprintf_l

Zapíše formátovaný výstup pomocí ukazatele na seznam argumentů. K dispozici jsou bezpečnější verze těchto funkcí; viz vsprintf_s, _vsprintf_s_l, vswprintf_s, _vswprintf_s_l.

Syntaxe

int vsprintf(
   char *buffer,
   const char *format,
   va_list argptr
);
int _vsprintf_l(
   char *buffer,
   const char *format,
   _locale_t locale,
   va_list argptr
);
int vswprintf(
   wchar_t *buffer,
   size_t count,
   const wchar_t *format,
   va_list argptr
);
int _vswprintf_l(
   wchar_t *buffer,
   size_t count,
   const wchar_t *format,
   _locale_t locale,
   va_list argptr
);
int __vswprintf_l(
   wchar_t *buffer,
   const wchar_t *format,
   _locale_t locale,
   va_list argptr
);
template <size_t size>
int vsprintf(
   char (&buffer)[size],
   const char *format,
   va_list argptr
); // C++ only
template <size_t size>
int _vsprintf_l(
   char (&buffer)[size],
   const char *format,
   _locale_t locale,
   va_list argptr
); // C++ only
template <size_t size>
int vswprintf(
   wchar_t (&buffer)[size],
   const wchar_t *format,
   va_list argptr
); // C++ only
template <size_t size>
int _vswprintf_l(
   wchar_t (&buffer)[size],
   const wchar_t *format,
   _locale_t locale,
   va_list argptr
); // C++ only

Parametry

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

count
Maximální počet znaků, které se mají uložit, v širokých řetězcových verzích této funkce.

format
Specifikace formátu

argptr
Ukazatel na seznam argumentů

locale
Národní prostředí, které se má použít

Vrácená hodnota

vsprintf a vswprintf vrátí počet zapsaných znaků, včetně ukončujícího NULL znaku nebo záporné hodnoty, pokud dojde k chybě výstupu. Pokud buffer nebo format je ukazatel, tyto funkce vyvolávají neplatnou obslužnou NULL rutinu 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 .

Informace o těchto a dalších kódech chyb naleznete v tématu , , , a_sys_nerr . _sys_errlist_doserrnoerrno

Poznámky

Každá z těchto funkcí vezme ukazatel na seznam argumentů a pak formátuje a zapíše daná data do paměti, na kterou bufferodkazuje .

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.

Důležité

Použití vsprintf, neexistuje způsob, jak omezit počet znaků zapsaných, což znamená, že kód používající tuto funkci je náchylný k přetečení vyrovnávací paměti. Místo toho použijte _vsnprintf nebo zavolejte _vscprintf , abyste zjistili, jak velká je vyrovnávací paměť potřebná. Také se ujistěte, ž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".

vswprintf odpovídá normě ISO C, která vyžaduje druhý parametr , counttypu size_t. Chcete-li vynutit staré nestandardní chování, definujte _CRT_NON_CONFORMING_SWPRINTFS. Staré chování nemusí být v budoucí verzi, 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
_vstprintf vsprintf vsprintf vswprintf
_vstprintf_l _vsprintf_l _vsprintf_l _vswprintf_l

Požadavky

Rutina Požadovaný hlavičkový soubor Volitelná záhlaví
vsprintf, _vsprintf_l <stdio.h> a <stdarg.h> <varargs.h>*
vswprintf, _vswprintf_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_vsprintf.c
// compile with: cl /W4 crt_vsprintf.c
// This program uses vsprintf to write to a buffer.
// The size of the buffer is determined by _vscprintf.

#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>

void test( char const * const format, ... )
{
    va_list args;
    int     len;
    char    *buffer;

    // retrieve the variable arguments
    va_start( args, format );

    len = _vscprintf( format, args ) // _vscprintf doesn't count
                                + 1; // terminating '\0'

    buffer = (char*)malloc( len * sizeof(char) );
    if ( 0 != buffer )
    {
        vsprintf( buffer, format, args ); // C4996
        // Note: vsprintf is deprecated; consider using vsprintf_s instead
        puts( buffer );

        free( buffer );
    }
    va_end( args );
}

int main( void )
{
   test( "%d %c %d", 123, '<', 456 );
   test( "%s", "This is a string" );
}
123 < 456
This is a string

Viz také

Vstupně-výstupní operace streamu
vprintf – funkce
Syntaxe specifikace formátu: printf a wprintf 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