Dela via


vsnprintf_s, _vsnprintf_s, _vsnprintf_s_l, , , _vsnwprintf_s_vsnwprintf_s_l

Skriv formaterade utdata med en pekare till en lista med argument. Dessa funktioner är versioner av vsnprintf, _vsnprintf, _vsnprintf_l, _vsnwprintf_vsnwprintf_l , med säkerhetsförbättringar som beskrivs i Säkerhetsfunktioner i CRT.

Syntax

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

Parameterar

buffer
Lagringsplats för utdata.

sizeOfBuffer
Storleken på buffer för utdata. Storlek i byte för de funktioner som tar charoch ord för de som tar wchar_t.

count
Maximalt antal tecken som ska skrivas, exklusive avslutande NULL. För de funktioner som tar wchar_tär det antalet breda tecken som ska skrivas. Eller _TRUNCATE.

format
Specifikation av format.

argptr
Pekare till en lista med argument.

locale
Språket som ska användas när du formaterar utdata.

Mer information finns i Formatspecifikationer.

Returvärde

Antalet skrivna tecken, exklusive avslutande NULL, eller ett negativt värde om ett utdatafel inträffar.

Mer information finns i Beteendesammanfattning .

Anmärkningar

Var och en av dessa funktioner tar en pekare till en argumentlista, formaterar och skriver sedan upp till count tecken i de givna data till minnet som pekas på av buffer och lägger till en avslutande NULL.

I felsökningsbyggen fylls de återstående sizeOfBuffer byten som följer efter avslutningen NULL med "xFE" enligt beskrivningen i _CrtSetDebugFillThreshold.

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.

vsnprintf_s är identisk med _vsnprintf_s och ingår för överensstämmelse med ANSI-standarden. _vnsprintf behålls för bakåtkompatibilitet.

Beteendesammanfattning

För följande tabell:

  • Låt vara len storleken på de formaterade data. Om funktionen tar en char buffert är storleken i byte. Om funktionen tar en wchar_t buffert anger storleken antalet 16-bitars ord.
  • Tecken refererar till char tecken för funktioner som tar en char buffert och till wchar_t tecken för funktioner som tar en wchar_t buffert.
  • Mer information om den ogiltiga parameterhanteraren finns i Parameterverifiering.
Tillstånd Beteende Returvärde errno Anropar ogiltig parameterhanterare
Framgång Skriver tecknen till bufferten med hjälp av den angivna formatsträngen Antalet tecken som skrivits Inte tillgänglig Nej
Kodningsfel under formatering Om du bearbetar strängspecificeraren s, S, eller Z, stoppas bearbetningen av formatspecifikationen. -1 EILSEQ (42) Nej
Kodningsfel under formatering Om bearbetningsteckenspecificeraren c eller C, hoppas det ogiltiga tecknet över. Antalet tecken som skrivs ökas inte för det överhoppade tecknet och inga data skrivs för det. Bearbetningen av formatspecifikationen fortsätter när du har hoppat över specificeraren med kodningsfelet. Antalet tecken som skrivs, inklusive avslutande NULL. EILSEQ (42) Nej
buffer == NULL och sizeOfBuffer == 0 och count == 0 Inga data skrivs. 0 Inte tillgänglig Nej
buffer == NULL och antingen sizeOfBuffer != 0 eller count != 0 Om körningen fortsätter efter att den ogiltiga parameterhanteraren har körts anger errno och returnerar ett negativt värde. -1 EINVAL (22) Ja
buffer != NULL och sizeOfBuffer == 0 Inga data skrivs. Om körningen fortsätter efter att den ogiltiga parameterhanteraren har körts anger errno och returnerar ett negativt värde. -1 EINVAL (22) Ja
buffer != NULL och sizeOfBuffer != 0 och count == 0 Bufferten avslutas NULL . -1 Inte tillgänglig Nej
count == 0 Skriver inga data och returnerar det antal tecken som skulle ha skrivits, exklusive den avslutande NULL. Antalet tecken som skulle ha skrivits, exklusive den avslutande NULL. Inte tillgänglig Nej
count < 0 Osäkert: värdet behandlas som osignerat, vilket sannolikt skapar ett stort värde som resulterar i att minnet som följer bufferten skrivs över. Antalet tecken som skrivs, inklusive avslutande NULL. Inte tillgänglig Nej
count < sizeOfBuffer och len <= count Alla data skrivs och en avslutande NULL läggs till. Antalet tecken som skrivits. Inte tillgänglig Nej
count < sizeOfBuffer och len > count De första count tecknen skrivs. -1 Inte tillgänglig Nej
count >= sizeOfBuffer och len < sizeOfBuffer Alla data skrivs med en avslutande NULL. Antalet tecken som skrivs, inklusive avslutande NULL. Inte tillgänglig Nej
count >= sizeOfBuffer och len >= sizeOfBuffer och count != _TRUNCATE Om körningen fortsätter efter att ogiltig parameterhanterare körs, uppsättningar errno, uppsättningar buffer[0] == NULLoch returnerar ett negativt värde. -1 ERANGE (34) Ja
count == _TRUNCATE och len >= sizeOfBuffer Skriver så mycket av strängen som får plats i buffer, inklusive den avslutande NULL. -1 Inte tillgänglig Nej
count == _TRUNCATE och len < sizeOfBuffer Skriver hela strängen till buffer med avslutande NULL. Antal skrivna tecken. Inte tillgänglig Nej
format == NULL Inga data skrivs. Om körningen fortsätter efter att den ogiltiga parameterhanteraren har körts anger errno och returnerar ett negativt värde. -1 EINVAL (22) Ja

Information om dessa och andra felkoder finns i _doserrno, errno, _sys_errlistoch _sys_nerr.

Viktigt!

Kontrollera 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.

Anmärkning

För att säkerställa att det finns utrymme för avslutningen NULL, se till att den count är strikt mindre än buffertlängden, eller använd _TRUNCATE.

I C++ förenklas användningen av dessa funktioner av överbelastningar av mallar; Överlagringarna kan härleda buffertlängden automatiskt (vilket eliminerar behovet av att ange ett storleksargument) och de kan automatiskt ersätta äldre, icke-säkra funktioner med sina nyare, säkra motsvarigheter. För mer information, se Secure template overloads.

Tips/Råd

Om du får ett odefinierat externt _vsnprintf_s fel och använder Universal C Runtime lägger du till legacy_stdio_definitions.lib i uppsättningen bibliotek som ska länkas. Universal C Runtime exporterar inte den här funktionen direkt utan definieras i stället infogad i <stdio.h>. Mer information finns i Översikt över potentiella uppgraderingsproblem och Ändringar av Visual Studio 2015-överensstämmelse.

Allmän textrutinmappning

TCHAR.H rutin _UNICODE och _MBCS inte definierat _MBCS definierad _UNICODE definierad
_vsntprintf_s _vsnprintf_s _vsnprintf_s _vsnwprintf_s
_vsntprintf_s_l _vsnprintf_s_l _vsnprintf_s_l _vsnwprintf_s_l

Kravspecifikation

Rutin Obligatoriskt huvud Valfria rubriker
vsnprintf_s <stdio.h> och <stdarg.h> <varargs.h>*
_vsnprintf_s, _vsnprintf_s_l <stdio.h> och <stdarg.h> <varargs.h>*
_vsnwprintf_s, _vsnwprintf_s_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_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!

Se även

Stream I/O-
vprintf 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