Udostępnij przez


_vsprintf_p, , _vsprintf_p_l, , _vswprintf_p_vswprintf_p_l

Zapisywanie sformatowanych danych wyjściowych przy użyciu wskaźnika do listy argumentów z możliwością określenia kolejności, w jakiej argumenty są używane.

Składnia

int _vsprintf_p(
   char *buffer,
   size_t sizeInBytes,
   const char *format,
   va_list argptr
);
int _vsprintf_p_l(
   char *buffer,
   size_t sizeInBytes,
   const char *format,
   _locale_t locale,
   va_list argptr
);
int _vswprintf_p(
   wchar_t *buffer,
   size_t count,
   const wchar_t *format,
   va_list argptr
);
int _vswprintf_p_l(
   wchar_t *buffer,
   size_t count,
   const wchar_t *format,
   _locale_t locale,
   va_list argptr
);

Parametry

buffer
Miejsce przechowywania danych wyjściowych.

sizeInBytes
Rozmiar w znakach buffer .

count
Maksymalna liczba znaków do zapisania w wersji UNICODE tej funkcji.

format
Specyfikacja formatu.

argptr
Wskaźnik do listy argumentów.

locale
Ustawienia regionalne, które mają być używane.

Wartość zwracana

_vsprintf_p i _vswprintf_p zwraca liczbę zapisanych znaków, nie wliczając znaku kończącego NULL , ani wartości ujemnej, jeśli wystąpi błąd wyjściowy. Jeśli jest buffer wskaźnikiem NULL i sizeInBytes lub count ma wartość zero, funkcje zwracają liczbę znaków, które zostałyby zapisane bez zakończenia NULL. Jeśli wartość jest prawidłowa buffer i sizeInBytes lub count wynosi zero, zwraca wartość -1.

Uwagi

Każda z tych funkcji pobiera wskaźnik do listy argumentów, a następnie formatuje i zapisuje podane dane w pamięci wskazywanej przez buffer.

Funkcje te różnią się od funkcji i vsprintf_s tylko tym, że obsługują vswprintf_s parametry pozycyjne. Aby uzyskać więcej informacji, zobacz printf_p Parametry pozycyjne.

Wersje tych funkcji z sufiksem _l są identyczne, z tą różnicą, że używają parametru locale przekazanego zamiast bieżących ustawień regionalnych wątku.

buffer Jeśli parametry or formatNULL wskaźnikami lub jeśli ciąg formatu zawiera nieprawidłowe znaki formatowania, wywoływana jest procedura obsługi nieprawidłowych parametrów, zgodnie z opisem w temacie Walidacja parametrów. Jeśli wykonywanie może być kontynuowane, funkcje zwracają -1 i ustawiają errno wartość EINVAL.

Ważne

Począwszy od systemu Windows 10 w wersji 2004 (kompilacja 19041), printf rodzina funkcji drukuje dokładnie możliwe liczby zmiennoprzecinkowe zgodnie z regułami IEEE 754 dotyczącymi zaokrąglania. W poprzednich wersjach systemu Windows dokładnie reprezentowane liczby zmiennoprzecinkowe kończące się na "5" zawsze zaokrągla się w górę. IEEE 754 stwierdza, że muszą zaokrąglić do najbliższej parzysta cyfra (znana również jako "Zaokrąglanie Bankiera"). Na przykład oba printf("%1.0f", 1.5)printf("%1.0f", 2.5) elementy i powinny być zaokrąglone do 2. Wcześniej 1,5 zaokrągliłoby się do 2 i 2,5 do 3. Ta zmiana dotyczy tylko dokładnie możliwych do reprezentowania liczb. Na przykład 2,35 (który, gdy jest reprezentowany w pamięci, jest bliżej 2,350000000000000008) nadal zaokrągla się do 2,4. Zaokrąglanie wykonywane przez te funkcje jest teraz również zgodne z trybem zaokrąglania zmiennoprzecinkowego ustawionym przez fesetround. Wcześniej zaokrąglanie zawsze wybierało FE_TONEAREST zachowanie. Ta zmiana dotyczy tylko programów utworzonych przy użyciu programu Visual Studio 2019 w wersji 16.2 lub nowszej. Aby użyć starszego zachowania zaokrąglania zmiennoprzecinkowego, połącz się z elementem legacy_stdio_float_rounding.obj.

Mapowania procedur tekstu ogólnego

Procedura TCHAR.H _UNICODE i _MBCS niezdefiniowane _MBCS zdefiniowany _UNICODE zdefiniowany
_vstprintf_p _vsprintf_p _vsprintf_p _vswprintf_p
_vstprintf_p_l _vsprintf_p_l _vsprintf_p_l _vswprintf_p_l

Wymagania

Procedura Wymagany nagłówek Opcjonalne nagłówki
_vsprintf_p, _vsprintf_p_l <stdio.h> i <stdarg.h> <varargs.h>*
_vswprintf_p, _vswprintf_p_l <stdio.h> lub <wchar.h> i <stdarg.h> <varargs.h>*

* Wymagane do zapewnienia zgodności z systemem UNIX V.

Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.

Przykład

// crt__vsprintf_p.c
// This program uses vsprintf_p to write to a buffer.
// The size of the buffer is determined by _vscprintf_p.

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

void example( char * format, ... )
{
    va_list  args;
    int      len;
    char     *buffer = NULL;

    va_start( args, format );

    // _vscprintf doesn't count the
    // null terminating string so we add 1.
    len = _vscprintf_p( format, args ) + 1;

    // Allocate memory for our buffer
    buffer = (char*)malloc( len * sizeof(char) );
    if (buffer)
    {
        _vsprintf_p( buffer, len, format, args );
        puts( buffer );
        free( buffer );
    }
    va_end( args );
}

int main( void )
{
    // First example
    example( "%2$d %1$c %3$d", '<', 123, 456 );

    // Second example
    example( "%s", "This is a string" );
}
123 < 456
This is a string

Zobacz także

We/Wy strumienia
vprintf funkcjonalności
Składnia specyfikacji formatu: printf i wprintf funkcje
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