Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Schreiben Sie formatierte Ausgaben mit einem Zeiger auf eine Liste von Argumenten. Sicherere Versionen dieser Funktionen sind verfügbar; siehe vsprintf_s
_vsprintf_s_l
Syntax
int vsprintf(
char *buffer,
const char *format,
va_list argptr
);
int _vsprintf_l(
char *buffer,
const char *format,
_locale_t locale,
va_list argptr
);
int vswprintf(
wchar_t *buffer,
size_t count,
const wchar_t *format,
va_list argptr
);
int _vswprintf_l(
wchar_t *buffer,
size_t count,
const wchar_t *format,
_locale_t locale,
va_list argptr
);
int __vswprintf_l(
wchar_t *buffer,
const wchar_t *format,
_locale_t locale,
va_list argptr
);
template <size_t size>
int vsprintf(
char (&buffer)[size],
const char *format,
va_list argptr
); // C++ only
template <size_t size>
int _vsprintf_l(
char (&buffer)[size],
const char *format,
_locale_t locale,
va_list argptr
); // C++ only
template <size_t size>
int vswprintf(
wchar_t (&buffer)[size],
const wchar_t *format,
va_list argptr
); // C++ only
template <size_t size>
int _vswprintf_l(
wchar_t (&buffer)[size],
const wchar_t *format,
_locale_t locale,
va_list argptr
); // C++ only
Die Parameter
buffer
Speicherort für die Ausgabe.
count
Maximale Anzahl von Zeichen, die in den Versionen mit breiten Zeichenfolgen dieser Funktion gespeichert werden sollen.
format
Format-Spezifikation.
argptr
Zeiger auf eine Liste von Argumenten.
locale
Das zu verwendende Gebietsschema.
Rückgabewert
vsprintf
und vswprintf
geben Sie die Anzahl der geschriebenen Zeichen ohne das abschließende NULL
Zeichen oder einen negativen Wert zurück, wenn ein Ausgabefehler auftritt. Wenn buffer
oder format
ein NULL
Zeiger ist, rufen diese Funktionen den Handler für ungültige Parameter auf, wie unter Parameterüberprüfung beschrieben. Wenn die Ausführung fortgesetzt werden darf, geben diese Funktionen -1 zurück und setzen errno
auf EINVAL
.
If buffer
ist ein NULL
Zeiger und count
ist Null, und _vswprintf_l
geben Sie die Anzahl der Zeichen zurück, vswprintf
die ohne das abschließende NULL geschrieben worden wären.
Wenn buffer
gültig ist und count
null ist, vswprintf
und _vswprintf_l
geben -1 zurück. Der Inhalt von buffer
bleibt unverändert.
Weitere Informationen zu diesen und anderen Fehlercodes finden Sie unter errno
, _doserrno
, _sys_errlist
und _sys_nerr
.
Bemerkungen
Jede dieser Funktionen verwendet einen Zeiger auf eine Argumentliste und formatiert dann die angegebenen Daten und schreibt sie in den Speicher, auf den mit buffer
zeigt.
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.
Von Bedeutung
Mit vsprintf
gibt es keine Möglichkeit, die Anzahl der geschriebenen Zeichen zu begrenzen, was bedeutet, dass Code, der diese Funktion verwendet, anfällig für Pufferüberläufe ist. Verwenden Sie _vsnprintf
stattdessen oder rufen Sie auf _vscprintf
, um zu bestimmen, wie groß ein Puffer erforderlich ist. Stellen Sie außerdem 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. Um das alte Gleitkomma-Rundungsverhalten zu verwenden, verknüpfen Sie mit 'legacy_stdio_float_rounding.obj'.
vswprintf
entspricht der ISO-C-Norm, die den zweiten Parameter, count
, vom Typ size_t
. Um das alte, nicht standardmäßige Verhalten zu erzwingen, definieren Sie _CRT_NON_CONFORMING_SWPRINTFS
. Das alte Verhalten ist möglicherweise nicht in einer zukünftigen Version enthalten, daher sollte der Code geändert werden, um das neue konforme Verhalten zu verwenden.
In C++ verfügen diese Funktionen über Vorlagenüberladungen, die die neueren, sicheren Entsprechungen dieser Funktionen aufrufen. Weitere Informationen finden Sie unter Secure Template Overloads.
Mapping generischer Textroutinen
TCHAR.H -Routine |
_UNICODE und _MBCS nicht definiert |
_MBCS definiert |
_UNICODE definiert |
---|---|---|---|
_vstprintf |
vsprintf |
vsprintf |
vswprintf |
_vstprintf_l |
_vsprintf_l |
_vsprintf_l |
_vswprintf_l |
Anforderungen
Routine | Erforderlicher Header | Optionale Header |
---|---|---|
vsprintf , _vsprintf_l |
<stdio.h> und <stdarg.h> |
<varargs.h> * |
vswprintf , _vswprintf_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_vsprintf.c
// compile with: cl /W4 crt_vsprintf.c
// This program uses vsprintf to write to a buffer.
// The size of the buffer is determined by _vscprintf.
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
void test( char const * const format, ... )
{
va_list args;
int len;
char *buffer;
// retrieve the variable arguments
va_start( args, format );
len = _vscprintf( format, args ) // _vscprintf doesn't count
+ 1; // terminating '\0'
buffer = (char*)malloc( len * sizeof(char) );
if ( 0 != buffer )
{
vsprintf( buffer, format, args ); // C4996
// Note: vsprintf is deprecated; consider using vsprintf_s instead
puts( buffer );
free( buffer );
}
va_end( args );
}
int main( void )
{
test( "%d %c %d", 123, '<', 456 );
test( "%s", "This is a string" );
}
123 < 456
This is a string
Siehe auch
Stream-E/A
vprintf
-Funktionen
Syntax der Formatspezifikation: printf
und wprintf
Funktionen
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