Dela via


vsprintf, _vsprintf_l, vswprintf, , , _vswprintf_l__vswprintf_l

Skriv formaterade utdata med en pekare till en lista med argument. Säkrare versioner av dessa funktioner är tillgängliga. se vsprintf_s, _vsprintf_s_l, vswprintf_s, _vswprintf_s_l.

Syntax

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

Parameterar

buffer
Lagringsplats för utdata.

count
Maximalt antal tecken som ska lagras i de breda strängversionerna av den här funktionen.

format
Specifikation av format.

argptr
Pekare till en lista med argument.

locale
Språkvarianten som ska användas.

Returvärde

vsprintf och vswprintf returnerar antalet skrivna tecken, exklusive det avslutande NULL tecknet, eller ett negativt värde om ett utdatafel inträffar. Om buffer eller format är en NULL pekare anropar dessa funktioner den ogiltiga parameterhanteraren, enligt beskrivningen i Parametervalidering. Om körningen tillåts fortsätta returnerar dessa funktioner -1 och ställs in errnoEINVAL.

If buffer är en NULL pekare och count är noll och vswprintf returnerar det antal tecken som skulle ha skrivits, _vswprintf_l exklusive det avslutande NULL.

Om buffer är giltigt och count är noll vswprintf och _vswprintf_l returnera -1. Innehållet buffer i är oförändrat.

Mer information om dessa och andra felkoder finns i errno, _doserrno, _sys_errlist, och _sys_nerr.

Anmärkningar

Var och en av dessa funktioner tar en pekare till en argumentlista och formaterar och skriver sedan de angivna data till minnet som pekas på av buffer.

Versionerna av dessa funktioner med suffixet _l är identiska, förutom att de använder parametern locale som skickas i stället för den aktuella trådspråkinställningen.

Viktigt!

Med finns vsprintfdet inget sätt att begränsa antalet skrivna tecken, vilket innebär att kod som använder den här funktionen är känslig för buffertöverskridningar. Använd _vsnprintf i stället eller anropa _vscprintf för att avgöra hur stor buffert som behövs. Kontrollera också att det format inte är en användardefinierad sträng. Mer information finns i Undvika buffertöverskridningar. Från och med Windows 10 version 2004 (version 19041) skriver funktionsfamiljen printf ut exakt representerande flyttalsnummer enligt IEEE 754-reglerna för avrundning. I tidigare versioner av Windows skulle exakt representerande flyttalsnummer som slutar på "5" alltid avrunda uppåt. IEEE 754 anger att de måste avrunda till den närmaste jämna siffran (även kallat "Bankers avrundning"). Till exempel bör både printf("%1.0f", 1.5) och printf("%1.0f", 2.5) avrunda till 2. Tidigare skulle 1,5 avrunda till 2 och 2,5 skulle avrunda till 3. Den här ändringen påverkar endast exakt representerande tal. Till exempel fortsätter 2.35 (som, när det representeras i minnet, är närmare 2.3500000000000000008) att avrunda upp till 2,4. Avrundning som utförs av dessa funktioner respekterar nu också flyttalsrundningsläget som anges av fesetround. Tidigare valde FE_TONEAREST avrundning alltid beteende. Den här ändringen påverkar endast program som skapats med Visual Studio 2019 version 16.2 och senare. Om du vill använda det äldre avrundningsbeteendet för flyttalser länkar du till legacy_stdio_float_rounding.obj.

vswprintf överensstämmer med ISO C-standarden, som kräver den andra parametern, count, av typen size_t. Om du vill tvinga fram det gamla icke-standardbeteendet definierar du _CRT_NON_CONFORMING_SWPRINTFS. Det gamla beteendet kanske inte finns i en framtida version, så koden bör ändras så att det nya överensstämmande beteendet används.

I C++ har dessa funktioner mallöverlagringar som anropar de nyare, säkra motsvarigheterna till dessa funktioner. För mer information, se Secure template overloads.

Allmän textrutinmappning

TCHAR.H rutin _UNICODE och _MBCS inte definierat _MBCS definierad _UNICODE definierad
_vstprintf vsprintf vsprintf vswprintf
_vstprintf_l _vsprintf_l _vsprintf_l _vswprintf_l

Kravspecifikation

Rutin Obligatoriskt huvud Valfria rubriker
vsprintf, _vsprintf_l <stdio.h> och <stdarg.h> <varargs.h>*
vswprintf, _vswprintf_l <stdio.h> eller <wchar.h>, och <stdarg.h> <varargs.h>*

* Krävs för UNIX V-kompatibilitet.

Mer kompatibilitetsinformation finns i Kompatibilitet.

Exempel

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

Se även

Stream I/O-
vprintf funktioner
Syntax för formatspecifikation: printf och wprintf funktioner
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_endva_start