Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Zapis sformatowanych danych wyjściowych przy użyciu wskaźnika do listy argumentów. Te funkcje to wersje , vsnprintf
, _vsnprintf_l
_vsnprintf
, _vsnwprintf
_vsnwprintf_l
z ulepszeniami zabezpieczeń zgodnie z opisem w temacie Funkcje zabezpieczeń w środowisku CRT.
Składnia
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
Lokalizacja magazynu dla danych wyjściowych.
sizeOfBuffer
Rozmiar elementu dla danych wyjściowych buffer
. Rozmiar w bajtach dla funkcji, które przyjmują char
, i wyrazy dla tych, które przyjmują wchar_t
.
count
Maksymalna liczba znaków do zapisu, które nie obejmują zakończenia .NULL
W przypadku funkcji, które przyjmują wchar_t
, jest to liczba znaków szerokich do zapisania. Lub _TRUNCATE
.
format
Specyfikacja formatu.
argptr
Wskaźnik do listy argumentów.
locale
Ustawienia regionalne do użycia podczas formatowania danych wyjściowych.
Aby uzyskać więcej informacji, zobacz Specyfikacje formatu.
Wartość zwracana
Liczba zapisanych znaków, a nie w tym zakończenie NULL
lub wartość ujemna, jeśli wystąpi błąd wyjściowy.
Aby uzyskać szczegółowe informacje, zobacz Podsumowanie zachowania.
Uwagi
vsnprintf_s
jest identyczny z _vsnprintf_s
i jest dołączony do zgodności ze standardem ANSI. _vnsprintf
jest zachowywany w celu zachowania zgodności z poprzednimi wersjami.
Każda z tych funkcji przyjmuje wskaźnik do listy argumentów, a następnie formatuje i zapisuje count
znaki danych do pamięci wskazywanej przez buffer
i dołącza wartość null zakończenia.
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.
Podsumowanie zachowania
W poniższej tabeli:
- Pozwól
len
na rozmiar sformatowanych danych. Jeśli funkcja przyjmujechar
bufor, rozmiar jest w bajtach. Jeśli funkcja przyjmujewchar_t
bufor, rozmiar określa liczbę 16-bitowych wyrazów. - Znaki odwołują się do
char
znaków funkcji, które przyjmująchar
bufor, oraz dowchar_t
znaków funkcji, które przyjmująwchar_t
bufor. - Aby uzyskać więcej informacji na temat nieprawidłowej procedury obsługi parametrów, zobacz Walidacja parametrów.
Stan | Zachowanie | Wartość zwracana | errno |
Wywołuje nieprawidłową procedurę obsługi parametrów |
---|---|---|---|---|
Powodzenie | Zapisuje znaki w buforze przy użyciu określonego ciągu formatu | Liczba zapisanych znaków | Nie dotyczy | Nie. |
Błąd kodowania podczas formatowania | Jeśli przetwarzanie specyfikatora s ciągów , S lub Z , przetwarzanie specyfikacji formatu zatrzymuje się. |
-1 | EILSEQ (42) |
Nie. |
Błąd kodowania podczas formatowania | Jeśli specyfikator c znaków przetwarzania lub C , jest pomijany nieprawidłowy znak. Liczba zapisanych znaków nie jest zwiększana dla pominiętego znaku ani żadnych zapisanych dla niego danych. Przetwarzanie specyfikacji formatu jest kontynuowane po pomijaniu specyfikatora z błędem kodowania. |
Liczba zapisanych znaków, a nie łącznie z kończeniem NULL . |
EILSEQ (42) |
Nie. |
buffer == NULL i i sizeOfBuffer == 0 count == 0 |
Żadne dane nie są zapisywane. | 0 | Nie dotyczy | Nie. |
buffer == NULL i albo sizeOfBuffer != 0 lub count != 0 |
Jeśli wykonanie będzie kontynuowane po wykonaniu nieprawidłowego programu obsługi parametrów, ustawia errno i zwraca wartość ujemną. |
-1 | EINVAL (22) |
Tak |
buffer != NULL i sizeOfBuffer == 0 |
Żadne dane nie są zapisywane. Jeśli wykonanie będzie kontynuowane po wykonaniu nieprawidłowego programu obsługi parametrów, ustawia errno i zwraca wartość ujemną. |
-1 | EINVAL (22) |
Tak |
count == 0 |
Nie zapisuje żadnych danych i zwraca liczbę znaków, które zostałyby zapisane, a nie w tym terminowanie NULL . |
Liczba znaków, które zostałyby zapisane, nie obejmują zakończenia NULL . |
Nie dotyczy | Nie. |
count < 0 |
Niebezpieczne: wartość jest traktowana jako niepodpisane, prawdopodobnie tworząc dużą wartość, która powoduje zastąpienie pamięci, która następuje po buforze. | Liczba zapisanych znaków, a nie łącznie z kończeniem NULL . |
Nie dotyczy | Nie. |
count < sizeOfBuffer i len <= count |
Wszystkie dane są zapisywane i dołączane są kończenie NULL . |
Liczba zapisanych znaków. | Nie dotyczy | Nie. |
count < sizeOfBuffer i len > count |
count Pierwsze znaki są zapisywane. |
-1 | Nie dotyczy | Nie. |
count >= sizeOfBuffer i len < sizeOfBuffer |
Wszystkie dane są zapisywane z kończeniem NULL . |
Liczba zapisanych znaków, a nie łącznie z kończeniem NULL . |
Nie dotyczy | Nie. |
count >= sizeOfBuffer i i len >= sizeOfBuffer count != _TRUNCATE |
Jeśli wykonanie będzie kontynuowane po wykonaniu nieprawidłowego programu obsługi parametrów, ustawia errno , ustawia buffer[0] == NULL wartości i zwraca wartość ujemną. |
-1 | ERANGE (34) |
Tak |
count == _TRUNCATE i len >= sizeOfBuffer |
Zapisuje tyle ciągów, ile pasuje do ciągu , w buffer tym zakończenia .NULL |
-1 | Nie dotyczy | Nie. |
count == _TRUNCATE i len < sizeOfBuffer |
Zapisuje cały ciąg w pliku buffer z kończeniem NULL . |
Liczba zapisanych znaków. | Nie dotyczy | Nie. |
format == NULL |
Żadne dane nie są zapisywane. Jeśli wykonanie będzie kontynuowane po wykonaniu nieprawidłowego programu obsługi parametrów, ustawia errno i zwraca wartość ujemną. |
-1 | EINVAL (22) |
Tak |
Aby uzyskać informacje o tych i innych kodach błędów, zobacz _doserrno
, errno
, _sys_errlist
i _sys_nerr
.
Ważne
Upewnij się, że format
nie jest to ciąg zdefiniowany przez użytkownika. Aby uzyskać więcej informacji, zobacz Unikanie przekroków buforu.
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".
Uwaga
Aby upewnić się, że istnieje miejsce na zakończenie wartości null, upewnij się, że count
jest ona ściśle mniejsza niż długość buforu lub użyj polecenia _TRUNCATE
.
W języku C++używanie tych funkcji jest uproszczone przez przeciążenia szablonu; przeciążenia mogą automatycznie wnioskować długość buforu (eliminując konieczność określenia argumentu rozmiaru) i mogą automatycznie zastępować starsze, niezabezpieczone funkcje nowszymi, bezpiecznymi odpowiednikami. Aby uzyskać więcej informacji, zobacz Bezpieczne przeciążenia szablonów.
Napiwek
Jeśli wystąpi niezdefiniowany błąd zewnętrzny _vsnprintf_s
i używasz uniwersalnego środowiska uruchomieniowego języka C, dodaj legacy_stdio_definitions.lib
do zestawu bibliotek, aby utworzyć link. Środowisko uruchomieniowe uniwersalnego języka C nie eksportuje tej funkcji bezpośrednio i zamiast tego jest definiowane w tekście w pliku <stdio.h>
. Aby uzyskać więcej informacji, zobacz Omówienie potencjalnych problemów z uaktualnieniem i zmian zgodności programu Visual Studio 2015.
Mapowania procedur tekstu ogólnego
TCHAR.H rutyna |
_UNICODE i _MBCS niezdefiniowane |
_MBCS zdefiniowany |
_UNICODE zdefiniowany |
---|---|---|---|
_vsntprintf_s |
_vsnprintf_s |
_vsnprintf_s |
_vsnwprintf_s |
_vsntprintf_s_l |
_vsnprintf_s_l |
_vsnprintf_s_l |
_vsnwprintf_s_l |
Wymagania
Procedura | Wymagany nagłówek | Opcjonalne nagłówki |
---|---|---|
vsnprintf_s |
<stdio.h> i <stdarg.h> |
<varargs.h> * |
_vsnprintf_s , _vsnprintf_s_l |
<stdio.h> i <stdarg.h> |
<varargs.h> * |
_vsnwprintf_s , _vsnwprintf_s_l |
<stdio.h> lub <wchar.h> , i <stdarg.h> |
<varargs.h> * |
* Wymagane do zachowania zgodności z systemem UNIX V.
Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.
Przykład
// 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!
Zobacz też
We/Wy strumienia
vprintf
, 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_end
va_start