Udostępnij za pośrednictwem


_sprintf_p, , _sprintf_p_l, , _swprintf_p_swprintf_p_l

Zapisuj sformatowane dane w ciągu z możliwością określenia kolejności, w jaką parametry są używane w ciągu formatu.

Składnia

int _sprintf_p(
   char *buffer,
   size_t sizeOfBuffer,
   const char *format [,
   argument_list]
);
int _sprintf_p_l(
   char *buffer,
   size_t sizeOfBuffer,
   const char *format,
   _locale_t locale [,
   argument_list]
);
int _swprintf_p(
   wchar_t *buffer,
   size_t sizeOfBuffer,
   const wchar_t *format [,
   argument_list]
);
int _swprintf_p_l(
   wchar_t *buffer,
   size_t sizeOfBuffer,
   const wchar_t *format,
   _locale_t locale [,
   argument_list]
);

Parametry

buffer
Lokalizacja magazynu dla danych wyjściowych

sizeOfBuffer
Maksymalna liczba znaków do zapisania.

format
Ciąg kontroli formatu.

argument_list
Opcjonalne argumenty dla ciągu formatu.

locale
Ustawienia regionalne do użycia.

Aby uzyskać więcej informacji, zobacz Składnia specyfikacji formatu.

Wartość zwracana

Liczba zapisanych znaków lub -1, jeśli wystąpił błąd.

Uwagi

Funkcja _sprintf_p formatuje i przechowuje serię znaków i wartości w pliku buffer. Każdy argument w argument_list obiekcie (jeśli istnieje) jest konwertowany i wyjściowy zgodnie z odpowiednią specyfikacją formatu w pliku format. Argument format używa składni specyfikacji formatu dla printf funkcji i wprintf . Znak null jest dołączany po zapisaniu ostatniego znaku. Jeśli kopiowanie odbywa się między nakładającymi się ciągami, zachowanie jest niezdefiniowane. Różnica między elementami _sprintf_p i sprintf_s polega na tym, że _sprintf_p obsługuje parametry pozycyjne, co umożliwia określenie kolejności, w jakiej argumenty są używane w ciągu formatu. Aby uzyskać więcej informacji, zobacz printf_p Parametry pozycyjne.

_swprintf_p jest wersją _sprintf_pwieloznakową ; argumenty wskaźnika do _swprintf_p są ciągami o szerokim znaku. Wykrywanie błędów kodowania w _swprintf_p programie może różnić się od wykrywania w programie _sprintf_p. _swprintf_p i fwprintf_p zachowują się identycznie, z tą różnicą, że _swprintf_p zapisuje dane wyjściowe w ciągu, a nie do miejsca docelowego typu FILE, i _swprintf_p wymaga count , aby parametr określał maksymalną liczbę znaków do zapisania. Wersje tych funkcji z sufiksem _l są identyczne, z tą różnicą, że używają parametru ustawień regionalnych przekazanych zamiast bieżących ustawień regionalnych wątku.

_sprintf_p Zwraca liczbę bajtów przechowywanych w bufferobiekcie , która nie zlicza znaku null zakończenia. _swprintf_p Zwraca liczbę znaków szerokich przechowywanych w bufferobiekcie , która nie zlicza znaku szerokiego o wartości null zakończenia. Jeśli buffer lub format jest wskaźnikiem o wartości null lub jeśli ciąg formatu zawiera nieprawidłowe znaki formatowania, wywoływana jest nieprawidłowa procedura obsługi parametrów, zgodnie z opisem w temacie Walidacja parametru. Jeśli wykonanie może kontynuować, te funkcje zwracają wartość -1 i ustawiają wartość errno 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

TCHAR.H rutyna _UNICODE i _MBCS niezdefiniowane _MBCS zdefiniowany _UNICODE zdefiniowany
_stprintf_p _sprintf_p _sprintf_p _swprintf_p
_stprintf_p_l _sprintf_p_l _sprintf_p_l _swprintf_p_l

Wymagania

Procedura Wymagany nagłówek
_sprintf_p, _sprintf_p_l <stdio.h>
_swprintf_p, _swprintf_p_l <stdio.h> lub <wchar.h>

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

Przykład: służy _sprintf_p do formatowania danych

// crt_sprintf_p.c
// This program uses _sprintf_p to format various
// data and place them in the string named buffer.
//

#include <stdio.h>

int main( void )
{
    char     buffer[200],
            s[] = "computer", c = 'l';
    int      i = 35,
            j;
    float    fp = 1.7320534f;

    // Format and print various data:
    j  = _sprintf_p( buffer, 200,
                     "   String:    %s\n", s );
    j += _sprintf_p( buffer + j, 200 - j,
                     "   Character: %c\n", c );
    j += _sprintf_p( buffer + j, 200 - j,
                     "   Integer:   %d\n", i );
    j += _sprintf_p( buffer + j, 200 - j,
                     "   Real:      %f\n", fp );

    printf( "Output:\n%s\ncharacter count = %d\n",
            buffer, j );
}
Output:
   String:    computer
   Character: l
   Integer:   35
   Real:      1.732053

character count = 79

Przykład: obsługa kodu błędu

// crt_swprintf_p.c
// This is the wide character example which
// also demonstrates _swprintf_p returning
// error code.
#include <stdio.h>

#define BUFFER_SIZE 100

int main( void )
{
    wchar_t buffer[BUFFER_SIZE];
    int     len;

    len = _swprintf_p(buffer, BUFFER_SIZE, L"%2$s %1$d",
                      0, L" marbles in your head.");
    _printf_p( "Wrote %d characters\n", len );

    // _swprintf_p fails because string contains WEOF (\xffff)
    len = _swprintf_p(buffer, BUFFER_SIZE, L"%s",
                      L"Hello\xffff world" );
    _printf_p( "Wrote %d characters\n", len );
}
Wrote 24 characters
Wrote -1 characters

Zobacz też

We/Wy strumienia
_fprintf_p, , _fprintf_p_l, , _fwprintf_p_fwprintf_p_l
fprintf, , _fprintf_l, , fwprintf_fwprintf_l
_printf_p, , _printf_p_l, , _wprintf_p_wprintf_p_l
printf, , _printf_l, , wprintf_wprintf_l
sprintf, , _sprintf_l, swprintf, , _swprintf_l__swprintf_l
scanf, , _scanf_l, , wscanf_wscanf_l
sscanf, , _sscanf_l, , swscanf_swscanf_l
sscanf_s, , _sscanf_s_l, , swscanf_s_swscanf_s_l
vprintf, funkcje
printf_p Parametry pozycyjne