Freigeben über


vsnprintf_s, , _vsnprintf_s_vsnprintf_s_l, , _vsnwprintf_s_vsnwprintf_s_l

Schreiben Sie formatierte Ausgaben mit einem Zeiger auf eine Liste von Argumenten. Bei diesen Funktionen handelt es sich um Versionen von vsnprintf, _vsnprintf, _vsnprintf_l, _vsnwprintfmit _vsnwprintf_l Sicherheitsverbesserungen, wie unter Sicherheitsfunktionen in der CRT beschrieben.

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

Die Parameter

buffer
Speicherort für die Ausgabe.

sizeOfBuffer
Die Größe der buffer for-Ausgabe. Größe in Byte für die Funktionen, die annehmen char, und Wörter für diejenigen, die wchar_t.

count
Maximale Anzahl von Zeichen, die geschrieben werden sollen, ohne abschließende NULL. Für die Funktionen, die verwenden wchar_t, ist es die Anzahl der zu schreibenden Breitzeichen. Oder _TRUNCATE.

format
Format-Spezifikation.

argptr
Zeiger auf eine Liste von Argumenten.

locale
Das Gebietsschema, das beim Formatieren der Ausgabe verwendet werden soll.

Weitere Informationen finden Sie unter Formatspezifikationen.

Rückgabewert

Die Anzahl der geschriebenen Zeichen, ohne den abschließenden NULLoder negativen Wert, wenn ein Ausgabefehler auftritt.

Weitere Informationen finden Sie in der Zusammenfassung des Verhaltens .

Bemerkungen

Jede dieser Funktionen nimmt einen Zeiger auf eine Argumentliste an, formatiert und schreibt dann bis zu zwei count Zeichen der angegebenen Daten in den Speicher, auf den gezeigt wird buffer , und hängt ein abschließendes NULL.

In Debug-Builds werden die verbleibenden sizeOfBuffer Bytes nach dem Beenden NULL mit 'xFE' gefüllt, wie in _CrtSetDebugFillThresholdbeschrieben.

Die Versionen dieser Funktionen mit dem _l Suffix sind identisch, mit der Ausnahme, dass sie den übergebenen locale-Parameter anstelle des aktuellen Thread-Gebietsschemas verwenden.

vsnprintf_s ist identisch mit _vsnprintf_s dem ANSI-Standard und ist zur Konformität mit dem ANSI-Standard enthalten. _vnsprintf wird aus Gründen der Abwärtskompatibilität beibehalten.

Zusammenfassung des Verhaltens

Für die folgende Tabelle:

  • Sei len die Größe der formatierten Daten. Wenn die Funktion einen char Puffer benötigt, wird die Größe in Byte angegeben. Wenn die Funktion einen wchar_t Puffer akzeptiert, gibt die Größe die Anzahl der 16-Bit-Wörter an.
  • Zeichen beziehen sich auf char Zeichen für Funktionen, die einen char Puffer verwenden, und auf wchar_t Zeichen für Funktionen, die einen wchar_t Puffer verwenden.
  • Weitere Informationen zum Handler für ungültige Parameter finden Sie unter Parametervalidierung.
Zustand Verhalten Rückgabewert errno Ruft einen ungültigen Parameterhandler auf
Erfolg Schreibt die Zeichen mit der angegebenen Formatzeichenfolge in den Puffer Die Anzahl der geschriebenen Zeichen Nicht verfügbar Nein
Kodierungsfehler beim Formatieren Wenn die Verarbeitung des Zeichenfolgenbezeichners s, Soder Z, wird die Verarbeitung der Formatspezifikation gestoppt. –1 EILSEQ (42) Nein
Kodierungsfehler beim Formatieren Bei der Verarbeitung des Zeichenbezeichners c oder Cwird das ungültige Zeichen übersprungen. Die Anzahl der geschriebenen Zeichen wird für das übersprungene Zeichen nicht erhöht, und es werden auch keine Daten dafür geschrieben. Die Verarbeitung der Formatspezifikation wird fortgesetzt, nachdem der Bezeichner mit dem Codierungsfehler übersprungen wurde. Die Anzahl der geschriebenen Zeichen, ohne die abschließende NULL. EILSEQ (42) Nein
buffer == NULL und sizeOfBuffer == 0 und count == 0 Es werden keine Daten geschrieben. 0 Nicht verfügbar Nein
buffer == NULL und entweder sizeOfBuffer != 0 oder count != 0 Wenn die Ausführung fortgesetzt wird, nachdem ein ungültiger Parameterhandler ausgeführt wurde, wird ein negativer Wert festgelegt errno und zurückgegeben. –1 EINVAL (22) Ja
buffer != NULL und sizeOfBuffer == 0 Es werden keine Daten geschrieben. Wenn die Ausführung fortgesetzt wird, nachdem ein ungültiger Parameterhandler ausgeführt wurde, wird ein negativer Wert festgelegt errno und zurückgegeben. –1 EINVAL (22) Ja
buffer != NULL und sizeOfBuffer != 0 und count == 0 Der Puffer wird NULL beendet. –1 Nicht verfügbar Nein
count == 0 Schreibt keine Daten und gibt die Anzahl der Zeichen zurück, die geschrieben worden wären, ohne die abschließende NULL. Die Anzahl der Zeichen, die ohne die abschließende NULL. Nicht verfügbar Nein
count < 0 Unsicher: Der Wert wird als vorzeichenlos behandelt, wodurch wahrscheinlich ein großer Wert erstellt wird, der dazu führt, dass der Speicher, der auf den Puffer folgt, überschrieben wird. Die Anzahl der geschriebenen Zeichen, ohne die abschließende NULL. Nicht verfügbar Nein
count < sizeOfBuffer und len <= count Alle Daten werden geschrieben und an eine Terminierung angehängt NULL . Die Anzahl der geschriebenen Zeichen. Nicht verfügbar Nein
count < sizeOfBuffer und len > count Die ersten count Zeichen sind geschrieben. –1 Nicht verfügbar Nein
count >= sizeOfBuffer und len < sizeOfBuffer Alle Daten werden mit einem abschließenden NULL. Die Anzahl der geschriebenen Zeichen, ohne die abschließende NULL. Nicht verfügbar Nein
count >= sizeOfBuffer und len >= sizeOfBuffer und count != _TRUNCATE Wenn die Ausführung nach der Ausführung eines ungültigen Parameterhandlers fortgesetzt wird, setzt errno, legt buffer[0] == NULLfest und gibt einen negativen Wert zurück. –1 ERANGE (34) Ja
count == _TRUNCATE und len >= sizeOfBuffer Schreibt so viel von der Zeichenfolge, wie hineinpasst buffer, einschließlich der abschließenden NULL. –1 Nicht verfügbar Nein
count == _TRUNCATE und len < sizeOfBuffer Schreibt den gesamten String in buffer mit dem Beenden NULLvon . Anzahl der geschriebenen Zeichen. Nicht verfügbar Nein
format == NULL Es werden keine Daten geschrieben. Wenn die Ausführung fortgesetzt wird, nachdem ein ungültiger Parameterhandler ausgeführt wurde, wird ein negativer Wert festgelegt errno und zurückgegeben. –1 EINVAL (22) Ja

Weitere Hinweise zu diesen und anderen Fehlercodes finden Sie unter _doserrno, errno, _sys_errlistund _sys_nerr.

Von Bedeutung

Stellen Sie sicher, dass es format sich nicht um eine benutzerdefinierte Zeichenfolge handelt. Weitere Informationen finden Sie unter Vermeiden von Pufferüberläufen. Ab Windows 10 Version 2004 (Build 19041) druckt die printf Funktionsfamilie exakt darstellbare Gleitkommazahlen gemäß den IEEE 754-Regeln für die Rundung. In früheren Versionen von Windows wurden genau darstellbare Gleitkommazahlen, die auf "5" endeten, immer aufgerundet. IEEE 754 besagt, dass sie auf die nächste gerade Ziffer runden müssen (auch bekannt als "Banker's Rounding"). Zum Beispiel sollte sowohl als auch printf("%1.0f", 1.5)printf("%1.0f", 2.5) auf 2 gerundet werden. Zuvor wurde 1,5 auf 2 und 2,5 auf 3 gerundet. Diese Änderung betrifft nur exakt darstellbare Zahlen. Beispiel: 2,35 (das, wenn es im Speicher dargestellt wird, näher an 2,350000000000000008 liegt) rundet weiter auf 2,4 auf. Die Rundung, die von diesen Funktionen durchgeführt wird, berücksichtigt nun auch den von festgelegten Gleitkomma-Rundungsmodus fesetround. Zuvor wählte die Rundung immer das Verhalten aus FE_TONEAREST . Diese Änderung betrifft nur Programme, die mit Visual Studio 2019 Version 16.2 und höher erstellt wurden. Zum Verwenden des älteren Gleitkomma-Rundungsverhaltens mit legacy_stdio_float_rounding.obj.

Hinweis

Um sicherzustellen, dass Platz für den Abschluss NULLvorhanden ist, stellen Sie sicher, dass er count streng kleiner als die Pufferlänge ist, oder verwenden Sie _TRUNCATE.

In C++ wird die Verwendung dieser Funktionen durch Vorlagenüberladungen vereinfacht. Die Überladungen können die Pufferlänge automatisch ableiten (ohne dass ein Größenargument angegeben werden muss), und sie können ältere, nicht sichere Funktionen automatisch durch ihre neueren, sicheren Gegenstücke ersetzen. Weitere Informationen finden Sie unter Secure Template Overloads.

Tipp

Wenn Sie einen nicht definierten externen _vsnprintf_s Fehler erhalten und die Universal C Runtime verwenden, fügen Sie sie der Gruppe der zu verknüpfenden Bibliotheken hinzu legacy_stdio_definitions.lib . Die Universal C Runtime exportiert diese Funktion nicht direkt, sondern wird inline in <stdio.h>definiert. Weitere Informationen finden Sie unter Übersicht über potenzielle Upgradeprobleme und Konformitätsänderungen in Visual Studio 2015.

Mapping generischer Textroutinen

TCHAR.H-Routine _UNICODE und _MBCS nicht definiert _MBCS definiert _UNICODE definiert
_vsntprintf_s _vsnprintf_s _vsnprintf_s _vsnwprintf_s
_vsntprintf_s_l _vsnprintf_s_l _vsnprintf_s_l _vsnwprintf_s_l

Anforderungen

Routine Erforderlicher Header Optionale Header
vsnprintf_s <stdio.h> und <stdarg.h> <varargs.h>*
_vsnprintf_s, _vsnprintf_s_l <stdio.h> und <stdarg.h> <varargs.h>*
_vsnwprintf_s, _vsnwprintf_s_l <stdio.h> oder <wchar.h>und <stdarg.h> <varargs.h>*

* Erforderlich für UNIX V-Kompatibilität.

Weitere Informationen zur Kompatibilität finden Sie unter Kompatibilität.

Beispiel

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

Siehe auch

Stream-E/A
vprintf -Funktionen
fprintf, , _fprintf_lfwprintf_fwprintf_l
printf, , _printf_lwprintf_wprintf_l
sprintf, , _sprintf_lswprintf, , _swprintf_l__swprintf_l
va_arg, , va_copyva_endva_start