vprintf, vfprintf, vsprintf, vsnprintf, vprintf_s, vfprintf_s, vsprintf_s, vsnprintf_s
|
Definiert in Header
<stdio.h>
|
||
| (1) | ||
|
int
vprintf
(
const
char
*
format, va_list vlist
)
;
|
(bis C99) | |
|
int
vprintf
(
const
char
*
restrict
format, va_list vlist
)
;
|
(seit C99) | |
| (2) | ||
|
int
vfprintf
(
FILE
*
stream,
const
char
*
format, va_list vlist
)
;
|
(bis C99) | |
|
int
vfprintf
(
FILE
*
restrict
stream,
const
char
*
restrict
format,
va_list vlist ) ; |
(seit C99) | |
| (3) | ||
|
int
vsprintf
(
char
*
buffer,
const
char
*
format, va_list vlist
)
;
|
(bis C99) | |
|
int
vsprintf
(
char
*
restrict
buffer,
const
char
*
restrict
format,
va_list vlist ) ; |
(seit C99) | |
|
int
vsnprintf
(
char
*
restrict
buffer,
size_t
bufsz,
const char * restrict format, va_list vlist ) ; |
(4) | (seit C99) |
|
int
vprintf_s
(
const
char
*
restrict
format, va_list vlist
)
;
|
(5) | (seit C11) |
|
int
vfprintf_s
(
FILE
*
restrict
stream,
const
char
*
restrict
format,
va_list vlist ) ; |
(6) | (seit C11) |
|
int
vsprintf_s
(
char
*
restrict
buffer, rsize_t bufsz,
const char * restrict format, va_list vlist ) ; |
(7) | (seit C11) |
|
int
vsnprintf_s
(
char
*
restrict
buffer, rsize_t bufsz,
const char * restrict format, va_list vlist ) ; |
(8) | (seit C11) |
Lädt die Daten von den durch vlist definierten Speicherorten, konvertiert sie in entsprechende Zeichenketten und schreibt die Ergebnisse in verschiedene Senken.
-
-
das Konvertierungsspezifizierer
%nist in format vorhanden -
eines der Argumente, die
%sentsprechen, ist ein Nullzeiger - format oder buffer ist ein Nullzeiger
- bufsz ist null oder größer als RSIZE_MAX
- Kodierungsfehler in einem der String- und Zeichenkonvertierungsspezifizierer auftreten
-
(nur für
vsprintf_s), der in buffer zu speichernde String (einschließlich des abschließenden Nullzeichens) würde bufsz überschreiten
-
das Konvertierungsspezifizierer
vprintf_s
,
vfprintf_s
,
vsprintf_s
und
vsnprintf_s
nur garantiert verfügbar, wenn
__STDC_LIB_EXT1__
durch die Implementierung definiert ist und wenn der Benutzer
__STDC_WANT_LIB_EXT1__
auf die Integer-Konstante
1
definiert, bevor
<stdio.h>
eingebunden wird.
Inhaltsverzeichnis |
Parameter
| stream | - | Ausgabedateistream, in den geschrieben wird |
| buffer | - | Zeiger auf einen Zeichenstring, in den geschrieben wird |
| bufsz | - | bis zu bufsz - 1 Zeichen können geschrieben werden, plus den Nullterminator |
| format | - | Zeiger auf einen nullterminierten Zeichenstring, der angibt, wie die Daten zu interpretieren sind |
| vlist | - | variable Argumentenliste, die die auszugebenden Daten enthält |
Die
Format
-Zeichenkette besteht aus gewöhnlichen Byte-Zeichen (außer
%
), die unverändert in den Ausgabestrom kopiert werden, und Konvertierungsspezifikationen. Jede Konvertierungsspezifikation hat folgendes Format:
-
-
Einleitendes
%Zeichen.
-
Einleitendes
-
- (optional) ein oder mehrere Flags, die das Verhalten der Konvertierung modifizieren:
-
-
-: das Ergebnis der Konvertierung wird innerhalb des Feldes linksbündig ausgerichtet (standardmäßig ist es rechtsbündig). -
+: das Vorzeichen von vorzeichenbehafteten Konvertierungen wird immer dem Ergebnis vorangestellt (standardmäßig wird das Ergebnis nur dann mit einem Minus versehen, wenn es negativ ist). -
space
: wenn das Ergebnis einer vorzeichenbehafteten Konvertierung nicht mit einem Vorzeichen beginnt oder leer ist, wird dem Ergebnis ein Leerzeichen vorangestellt. Wird ignoriert, wenn das
+-Flag vorhanden ist. -
#: alternative Form der Konvertierung wird durchgeführt. Siehe die nachfolgende Tabelle für genaue Auswirkungen, andernfalls ist das Verhalten undefiniert. -
0: für Ganzzahl- und Gleitkommazahl-Konvertierungen werden führende Nullen zum Auffüllen des Feldes verwendet anstelle von space -Zeichen. Für Ganzzahlen wird es ignoriert, wenn die Genauigkeit explizit angegeben ist. Für andere Konvertierungen führt die Verwendung dieses Flags zu undefiniertem Verhalten. Wird ignoriert, wenn das--Flag vorhanden ist.
-
-
-
(optional)
Ganzzahlwert oder
*, der die minimale Feldbreite angibt. Das Ergebnis wird bei Bedarf auf der linken Seite (bei rechtsbündiger Ausrichtung) oder auf der rechten Seite (bei linksbündiger Ausrichtung) mit Leerzeichen aufgefüllt (standardmäßig). Falls*verwendet wird, wird die Breite durch ein zusätzliches Argument vom Typ int angegeben, das vor dem zu konvertierenden Argument und dem die Genauigkeit liefernden Argument (falls vorhanden) erscheint. Wenn der Wert des Arguments negativ ist, führt dies zur Angabe des--Flags und einer positiven Feldbreite (Hinweis: Dies ist die minimale Breite: Der Wert wird niemals abgeschnitten.).
-
(optional)
Ganzzahlwert oder
-
-
(optional)
.gefolgt von einer Ganzzahl oder*, oder keines von beiden, was die Präzision der Konvertierung spezifiziert. Falls*verwendet wird, wird die Präzision durch ein zusätzliches Argument vom Typ int angegeben, das vor dem zu konvertierenden Argument erscheint, aber nach dem Argument, das die minimale Feldbreite liefert, falls eines angegeben wurde. Wenn der Wert dieses Arguments negativ ist, wird er ignoriert. Wenn weder eine Zahl noch*verwendet wird, wird die Präzision als Null angenommen. Siehe die nachfolgende Tabelle für die genauen Auswirkungen der Präzision .
-
(optional)
-
- (optional) Längenmodifikator der die Größe des Arguments spezifiziert (in Kombination mit dem Konvertierungsformat-Spezifizierer bestimmt er den Typ des entsprechenden Arguments).
-
- Konvertierungsformat-Spezifizierer.
Die folgenden Formatbezeichner sind verfügbar:
| Konvertierungsspezifizierer | Erklärung |
Erwarteter
Argumenttyp |
||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Längenmodifikator→ | hh | h | keine | l | ll | j | z | t | L | |
| Nur verfügbar seit C99→ | Ja | Ja | Ja | Ja | Ja | |||||
%
|
Schreibt ein literales
%
. Die vollständige Konvertierungsspezifikation muss
%%
lauten.
|
N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A |
c
|
Schreibt ein einzelnes Zeichen .
|
N/A | N/A |
int
|
wint_t
|
N/A | N/A | N/A | N/A | N/A |
s
|
Schreibt einen Zeichenstring .
|
N/A | N/A |
char
*
|
wchar_t
*
|
N/A | N/A | N/A | N/A | N/A |
d
i
|
Wandelt eine vorzeichenbehaftete Ganzzahl in die Dezimaldarstellung [-]dddd um.
|
signed
char
|
short
|
int
|
long
|
long
long
|
※
|
N/A | ||
o
|
Wandelt eine vorzeichenlose Ganzzahl in die Oktaldarstellung oooo um.
|
unsigned
char
|
unsigned
short
|
unsigned
int
|
unsigned
long
|
unsigned
long
long
|
vorzeichenlose Version von
ptrdiff_t
|
N/A | ||
x
X
|
Wandelt eine vorzeichenlose Ganzzahl in die hexadezimale Darstellung hhhh um.
|
N/A | ||||||||
u
|
Wandelt eine unsigned integer in die Dezimaldarstellung dddd um.
|
N/A | ||||||||
f
F
(C99)
|
Konvertiert eine Gleitkommazahl in die Dezimalschreibweise im Format [-]ddd.ddd .
|
N/A | N/A |
double
|
double
(C99)
|
N/A | N/A | N/A | N/A |
long
double
|
e
E
|
Wandelt eine Gleitkommazahl in die dezimale Exponentenschreibweise um.
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
a
A
(C99) |
Wandelt eine Gleitkommazahl in die hexadezimale Exponentenschreibweise um.
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
g
G
|
Wandelt eine Gleitkommazahl in Dezimal- oder Exponentenschreibweise um, abhängig vom Wert und der Genauigkeit .
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
n
|
Gibt die Anzahl der bisher geschriebenen Zeichen durch diesen Funktionsaufruf zurück.
|
signed
char
*
|
short
*
|
int
*
|
long
*
|
long
long
*
|
intmax_t
*
|
※
|
N/A | |
p
|
Schreibt eine implementierungsdefinierte Zeichensequenz, die einen Zeiger definiert. |
N/A | N/A |
void
*
|
N/A | N/A | N/A | N/A | N/A | N/A |
| Hinweise | ||||||||||
|
Die Gleitkomma-Konvertierungsfunktionen konvertieren Unendlich zu
Keine-Zahl wird zu
Die Konvertierungen
Der Konvertierungsspezifizierer zum Drucken von char , unsigned char , signed char , short und unsigned short erwartet gepromotete Typen von Default Argument Promotions , aber vor dem Drucken wird sein Wert zu char , unsigned char , signed char , short und unsigned short konvertiert. Es ist sicher, Werte dieser Typen zu übergeben, aufgrund der Promotion, die beim Aufruf einer variadischen Funktion stattfindet.
Die korrekten Konvertierungsspezifizierer für die festbreitigen Zeichentypen (
int8_t
usw.) sind im Header
<inttypes.h>
definiert (obwohl
PRIdMAX
,
PRIuMAX
usw. synonym mit
Der speicher-schreibende Konvertierungsspezifizierer
Es gibt einen
Sequence Point
nach der Aktion jedes Konvertierungsspezifizierers; dies erlaubt das Speichern mehrerer
Wenn eine Konvertierungsspezifikation ungültig ist, ist das Verhalten undefiniert. |
||||||||||
Rückgabewert
Hinweise
Alle diese Funktionen rufen va_arg mindestens einmal auf, der Wert von arg ist nach der Rückgabe undefiniert. Diese Funktionen rufen nicht va_end auf, dies muss vom Aufrufer durchgeführt werden.
vsnprintf_s
, im Gegensatz zu
vsprintf_s
, wird das Ergebnis abschneiden, um in das durch
buffer
zeigende Array zu passen.
Die Implementierung von
vsnprintf_s
im
Microsoft CRT
entspricht nicht dem C-Standard. Die Microsoft-Version hat einen zusätzlichen Parameter
size_t
count
an dritter Position, der die maximale Anzahl der zu schreibenden Zeichen enthält, ohne den Nullterminator. Dieser Parameter unterscheidet sich möglicherweise von der Puffergröße, die über den Parameter
size_t
bufsz
bereitgestellt wird.
Beispiel
#include <stdarg.h> #include <stdio.h> #include <time.h> void debug_log(const char* fmt, ...) { struct timespec ts; timespec_get(&ts, TIME_UTC); char time_buf[100]; size_t rc = strftime(time_buf, sizeof time_buf, "%D %T", gmtime(&ts.tv_sec)); snprintf(time_buf + rc, sizeof time_buf - rc, ".%06ld UTC", ts.tv_nsec / 1000); va_list args1; va_start(args1, fmt); va_list args2; va_copy(args2, args1); char buf[1+vsnprintf(NULL, 0, fmt, args1)]; va_end(args1); vsnprintf(buf, sizeof buf, fmt, args2); va_end(args2); printf("%s [debug]: %s\n", time_buf, buf); } int main(void) { debug_log("Logging, %d, %d, %d", 1, 2, 3); }
Mögliche Ausgabe:
02/20/15 21:58:09.072683 UTC [debug]: Logging, 1, 2, 3
Referenzen
- C23-Standard (ISO/IEC 9899:2024):
-
- 7.21.6.8 Die vfprintf-Funktion (S.: TBD)
-
- 7.21.6.10 Die vprintf-Funktion (S.: TBD)
-
- 7.21.6.12 Die vsnprintf-Funktion (S.: TBD)
-
- 7.21.6.13 Die vsprintf-Funktion (S.: TBD)
-
- K.3.5.3.8 Die vfprintf_s-Funktion (S.: TBD)
-
- K.3.5.3.10 Die vprintf_s-Funktion (S.: TBD)
-
- K.3.5.3.12 Die vsnprintf_s-Funktion (S.: TBD)
-
- K.3.5.3.13 Die vsprintf_s-Funktion (S.: TBD)
- C17-Standard (ISO/IEC 9899:2018):
-
- 7.21.6.8 Die vfprintf-Funktion (S: 238)
-
- 7.21.6.10 Die vprintf-Funktion (S: 239)
-
- 7.21.6.12 Die vsnprintf-Funktion (S: 239-240)
-
- 7.21.6.13 Die vsprintf-Funktion (S: 240)
-
- K.3.5.3.8 Die vfprintf_s-Funktion (S: 434)
-
- K.3.5.3.10 Die vprintf_s-Funktion (S: 435)
-
- K.3.5.3.12 Die vsnprintf_s-Funktion (S: 436-437)
-
- K.3.5.3.13 Die vsprintf_s-Funktion (S: 437)
- C11-Standard (ISO/IEC 9899:2011):
-
- 7.21.6.8 Die vfprintf-Funktion (S. 326-327)
-
- 7.21.6.10 Die vprintf-Funktion (S. 328)
-
- 7.21.6.12 Die vsnprintf-Funktion (S. 329)
-
- 7.21.6.13 Die vsprintf-Funktion (S. 329)
-
- K.3.5.3.8 Die vfprintf_s-Funktion (S. 597)
-
- K.3.5.3.10 Die vprintf_s-Funktion (S. 598-599)
-
- K.3.5.3.12 Die vsnprintf_s-Funktion (S. 600)
-
- K.3.5.3.13 Die vsprintf_s-Funktion (S. 601)
- C99-Standard (ISO/IEC 9899:1999):
-
- 7.19.6.8 Die vfprintf-Funktion (S: 292)
-
- 7.19.6.10 Die vprintf-Funktion (S: 293)
-
- 7.19.6.12 Die vsnprintf-Funktion (S: 294)
-
- 7.19.6.13 Die vsprintf-Funktion (S: 295)
- C89/C90 Standard (ISO/IEC 9899:1990):
-
- 4.9.6.7 Die vfprintf-Funktion
-
- 4.9.6.8 Die vprintf-Funktion
-
- 4.9.6.9 Die vsprintf-Funktion
Siehe auch
|
(C95)
(C95)
(C95)
(C11)
(C11)
(C11)
(C11)
|
gibt formatierten Breitzeichen-Output an
stdout
, einen Dateistream
oder einen Puffer unter Verwendung einer variablen Argumentenliste aus (Funktion) |
|
(C99)
(C11)
(C11)
(C11)
(C11)
|
gibt formatierten Output an
stdout
, einen Dateistream oder einen Puffer aus
(Funktion) |
|
(C99)
(C99)
(C99)
(C11)
(C11)
(C11)
|
liest formatierten Input von
stdin
, einem Dateistream oder einem Puffer
unter Verwendung einer variablen Argumentenliste (Funktion) |
|
C++-Dokumentation
für
vprintf
,
vfprintf
,
vsprintf
,
vsnprintf
|
|