Namensräume
Varianten
Aktionen

std::vprintf, std::vfprintf, std::vsprintf, std::vsnprintf

Von cppreference.com
< cpp‎ | io‎ | c
 
 
 
C-Style I/O
Typen und Objekte
Funktionen
Datei-Zugriff
Direkte Ein-/Ausgabe
Unformatierte Ein-/Ausgabe
Formatierte Eingabe
(C++11)(C++11)(C++11)    
(C++11)(C++11)(C++11)    
Formatierte Ausgabe
vprintfvfprintfvsprintfvsnprintf
(C++11)    
Dateipositionierung
Fehlerbehandlung
Operationen auf Dateien
 
Definiert in Header <cstdio>
int vprintf( const char* format, std::va_list vlist );
(1)
int vfprintf( std::FILE* stream, const char* format, std::va_list vlist );
(2)
int vsprintf( char* buffer, const char* format, std::va_list vlist );
(3)
int vsnprintf( char* buffer, std::size_t buf_size, const char* format, std::va_list vlist );
(4) (seit C++11)

Lädt die Daten von den durch vlist definierten Speicherorten, konvertiert sie in Zeichenketten-Äquivalente und schreibt die Ergebnisse in verschiedene Ziele.

1) Schreibt die Ergebnisse nach stdout.
2) Schreibt die Ergebnisse in einen Dateistrom stream.
3) Schreibt die Ergebnisse in eine Zeichenkette buffer.
4) Schreibt die Ergebnisse in eine Zeichenkette buffer. Maximal buf_size - 1 Zeichen werden geschrieben. Die resultierende Zeichenkette wird mit einem Nullzeichen abgeschlossen, es sei denn, buf_size ist null. Wenn buf_size null ist, wird nichts geschrieben und buffer kann ein Null-Zeiger sein, jedoch wird der Rückgabewert (Anzahl der Bytes, die geschrieben worden wären, ohne den Null-Terminator) immer noch berechnet und zurückgegeben.

Inhalt

[edit] Parameter

stream - Ausgabestream, in den geschrieben werden soll
buffer - Zeiger auf eine Zeichenkette, in die geschrieben werden soll
buf_size - maximale Anzahl zu schreibender Zeichen
format - Zeiger auf eine null-terminierte Zeichenkette, die angibt, wie die Daten interpretiert werden sollen
vlist - variable Argumentenliste, die die zu druckenden Daten enthält

Die format-Zeichenkette besteht aus gewöhnlichen Byte-Zeichen (außer %), die unverändert in den Ausgabestrom kopiert werden, und Konversionsspezifikationen. Jede Konversionsspezifikation hat das folgende Format:

  • ein einführendes %-Zeichen.
  • (optional) ein oder mehrere Flags, die das Verhalten der Konversion modifizieren
  • -: Das Ergebnis der Konversion wird im Feld linksbündig ausgerichtet (standardmäßig rechtsbündig).
  • +: Das Vorzeichen von Vorzeichenkonversionen wird immer dem Ergebnis der Konversion vorangestellt (standardmäßig wird dem Ergebnis nur dann ein Minus vorangestellt, wenn es negativ ist).
  • Leerzeichen: Wenn das Ergebnis einer Vorzeichenkonversion nicht mit einem Vorzeichen beginnt oder leer ist, wird dem Ergebnis ein Leerzeichen vorangestellt. Es wird ignoriert, wenn das Flag + vorhanden ist.
  • #: Eine alternative Form der Konversion wird durchgeführt. Die genauen Effekte sind in der untenstehenden Tabelle aufgeführt, andernfalls ist das Verhalten undefiniert.
  • 0: Bei Ganzzahl- und Gleitkommazahlenkonversionen werden die Felder mit Nullen aufgefüllt anstelle von Leerzeichen. Bei Ganzzahlen wird dies ignoriert, wenn die Genauigkeit explizit angegeben ist. Bei anderen Konversionen führt die Verwendung dieses Flags zu undefiniertem Verhalten. Es wird ignoriert, wenn das Flag - vorhanden ist.
  • (optional) ein Ganzzahlwert oder *, der die minimale Feldbreite angibt. Das Ergebnis wird, falls erforderlich, mit Leerzeichen aufgefüllt (standardmäßig) links, wenn rechtsbündig, oder rechts, wenn linksbündig. Wenn * verwendet wird, wird die Breite durch ein zusätzliches Argument vom Typ int angegeben, das vor dem zu konvertierenden Argument und dem Präzisionsargument (falls vorhanden) steht. Wenn der Wert des Arguments negativ ist, resultiert dies in der Angabe des Flags - und einer positiven Feldbreite (Hinweis: Dies ist die minimale Breite: Der Wert wird niemals abgeschnitten).
  • (optional) . gefolgt von einer Ganzzahl oder *, oder weder noch, das die Genauigkeit der Konversion angibt. Wenn * verwendet wird, wird die Genauigkeit durch ein zusätzliches Argument vom Typ int angegeben, das vor dem zu konvertierenden Argument steht, aber nach dem Argument für die minimale Feldbreite (falls vorhanden). Wenn der Wert dieses Arguments negativ ist, wird es ignoriert. Wenn weder eine Zahl noch * verwendet wird, wird die Genauigkeit als Null angenommen. Die genauen Effekte der Genauigkeit sind in der untenstehenden Tabelle aufgeführt.
  • (optional) Ein Längenmodifikator, der die Größe des Arguments angibt (in Kombination mit dem Konversionsformat-Spezifizierer gibt er den Typ des entsprechenden Arguments an).
  • Ein Konversionsformat-Spezifizierer.

Die folgenden Format-Spezifizierer sind verfügbar:

Konversion
Spezifizierer
Erklärung Erwartet
Argumenttyp
Längenmodifikator → hh h keine l ll j z t L
Nur verfügbar ab C++11 → Ja Ja Ja Ja Ja
% Schreibt ein literales %. Die vollständige Konversionsspezifikation muss %% sein. N/A N/A N/A N/A N/A N/A N/A N/A N/A
c

Schreibt ein einzelnes Zeichen.

  • Das Argument wird zuerst in unsigned char konvertiert.
  • Wenn der Modifikator l verwendet wird, wird das Argument zuerst in eine Zeichenkette konvertiert, als ob es mit %ls mit einem wchar_t[2] Argument wäre.
N/A N/A
int
std::wint_t
N/A N/A N/A N/A N/A
s

Schreibt eine Zeichenkette.

  • Das Argument muss ein Zeiger auf das erste Element eines Arrays von Zeichen sein.
  • Genauigkeit gibt die maximal zu schreibende Byte-Anzahl an. Wenn Genauigkeit nicht angegeben ist, werden alle Bytes bis zum ersten Nullterminator (ausschließlich) geschrieben.
  • Wenn der Spezifizierer l verwendet wird, muss das Argument ein Zeiger auf das erste Element eines Arrays von wchar_t sein, das als Zeichenarray konvertiert wird, als ob durch einen Aufruf von std::wcrtomb mit einer mit Null initialisierten Konvertierungszustand.
N/A N/A
char*
wchar_t*
N/A N/A N/A N/A N/A
d
i

Konvertiert eine vorzeichenbehaftete Ganzzahl in die Dezimaldarstellung [-]dddd.

  • Genauigkeit gibt die minimale Anzahl der anzuzeigenden Ziffern an. Die Standardgenauigkeit ist 1.
  • Wenn sowohl der konvertierte Wert als auch die Genauigkeit 0 sind, erzeugt die Konversion keine Zeichen.
  • Für den z-Modifikator ist der erwartete Argumenttyp die vorzeichenbehaftete Version von std::size_t.
signed char
short
int
long
long long
N/A
o

Konvertiert eine vorzeichenlose Ganzzahl in die Oktaldarstellung oooo.

  • Genauigkeit gibt die minimale Anzahl der anzuzeigenden Ziffern an. Die Standardgenauigkeit ist 1.
  • Wenn sowohl der konvertierte Wert als auch die Genauigkeit 0 sind, erzeugt die Konversion keine Zeichen.
  • In der alternativen Implementierung wird die Genauigkeit bei Bedarf erhöht, um eine führende Null zu schreiben. In diesem Fall wird, wenn sowohl der konvertierte Wert als auch die Genauigkeit 0 sind, eine einzelne 0 geschrieben.
unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long
vorzeichenlose Version von std::ptrdiff_t
N/A
x
X

Konvertiert eine vorzeichenlose Ganzzahl in die Hexadezimaldarstellung hhhh.

  • Für die x-Konversionsbuchstaben werden abcdef verwendet.
  • Für die X-Konversionsbuchstaben werden ABCDEF verwendet.
  • Genauigkeit gibt die minimale Anzahl der anzuzeigenden Ziffern an. Die Standardgenauigkeit ist 1.
  • Wenn sowohl der konvertierte Wert als auch die Genauigkeit 0 sind, erzeugt die Konversion keine Zeichen.
  • In der alternativen Implementierung wird den Ergebnissen 0x oder 0X vorangestellt, wenn der konvertierte Wert ungleich Null ist.
N/A
u

Konvertiert eine vorzeichenlose Ganzzahl in die Dezimaldarstellung dddd.

  • Genauigkeit gibt die minimale Anzahl der anzuzeigenden Ziffern an.
  • Die Standardgenauigkeit ist 1.
  • Wenn sowohl der konvertierte Wert als auch die Genauigkeit 0 sind, erzeugt die Konversion keine Zeichen.
N/A
f
F (C++11)

Konvertiert eine Gleitkommazahl in die Dezimalnotation im Stil [-]ddd.ddd.

  • Genauigkeit gibt die genaue Anzahl der Ziffern nach dem Dezimaltrennzeichen an.
  • Die Standardgenauigkeit ist 6.
  • In der alternativen Implementierung wird das Dezimaltrennzeichen auch dann geschrieben, wenn keine Ziffern darauf folgen.
  • Informationen zur Konversion von Unendlichkeit und Nicht-Zahl im Hinblick auf den Stil finden Sie unter Anmerkungen.
N/A N/A
double
double (C++11)
N/A N/A N/A N/A
long double
e
E

Konvertiert eine Gleitkommazahl in die Dezimal-Exponent-Notation.

  • Für den e-Konversionsstil wird [-]d.ddd e±dd verwendet.
  • Für den E-Konversionsstil wird [-]d.ddd E±dd verwendet.
  • Der Exponent enthält mindestens zwei Ziffern, mehr Ziffern werden nur bei Bedarf verwendet.
  • Wenn der Wert 0 ist, ist auch der Exponent 0.
  • Genauigkeit gibt die genaue Anzahl der Ziffern nach dem Dezimaltrennzeichen an.
  • Die Standardgenauigkeit ist 6.
  • In der alternativen Implementierung wird das Dezimaltrennzeichen auch dann geschrieben, wenn keine Ziffern darauf folgen.
  • Informationen zur Konversion von Unendlichkeit und Nicht-Zahl im Hinblick auf den Stil finden Sie unter Anmerkungen.
N/A N/A N/A N/A N/A N/A
a
A

(C++11)

Konvertiert eine Gleitkommazahl in die Hexadezimal-Exponent-Notation.

  • Für den a-Konversionsstil wird [-] 0xh.hhh p±d verwendet.
  • Für den A-Konversionsstil wird [-] 0Xh.hhh P±d verwendet.
  • Die erste Hexadezimalziffer ist nicht 0, wenn das Argument ein normalisierter Gleitkommawert ist.
  • Wenn der Wert 0 ist, ist auch der Exponent 0.
  • Genauigkeit gibt die exakte Anzahl der Ziffern nach dem Hexadezimaltrennzeichen an.
  • Die Standardgenauigkeit ist ausreichend für die exakte Darstellung des Wertes.
  • In der alternativen Implementierung wird das Dezimaltrennzeichen auch dann geschrieben, wenn keine Ziffern darauf folgen.
  • Informationen zur Konversion von Unendlichkeit und Nicht-Zahl im Hinblick auf den Stil finden Sie unter Anmerkungen.
N/A N/A N/A N/A N/A N/A
g
G

Konvertiert eine Gleitkommazahl je nach Wert und Genauigkeit in die Dezimal- oder Dezimal-Exponent-Notation.

  • Für den g-Konversionsstil wird die Konversion mit dem Stil e oder f durchgeführt.
  • Für den G-Konversionsstil wird die Konversion mit dem Stil E oder f(bis C++11)F(seit C++11) durchgeführt.
  • Sei P gleich der Genauigkeit, wenn diese ungleich Null ist, 6, wenn die Genauigkeit nicht angegeben ist, oder 1, wenn die Genauigkeit 0 ist. Dann, wenn eine Konversion im Stil E einen Exponenten von X hätte:
    • Wenn P > X ≥ −4, erfolgt die Konversion im Stil f oder F(seit C++11) mit einer Genauigkeit von P − 1 − X.
    • Andernfalls erfolgt die Konversion im Stil e oder E mit einer Genauigkeit von P − 1.
  • Sofern keine alternative Darstellung angefordert wird, werden nachfolgende Nullen entfernt, und das Dezimaltrennzeichen wird entfernt, wenn kein Bruchteil übrig bleibt.
  • Informationen zur Konversion von Unendlichkeit und Nicht-Zahl im Hinblick auf den Stil finden Sie unter Anmerkungen.
N/A N/A N/A N/A N/A N/A
n

Gibt die bisher von diesem Funktionsaufruf geschriebene Anzahl der Zeichen zurück.

  • Das Ergebnis wird an den Wert geschrieben, auf den das Argument zeigt.
  • Die Spezifikation darf keine Flags, Feldbreiten oder Genauigkeiten enthalten.
  • Für den z-Modifikator ist der erwartete Argumenttyp S*, wobei S die vorzeichenbehaftete Version von std::size_t ist.
signed char*
short*
int*
long*
long long*
N/A
p

Schreibt eine implementierungsdefinierte Zeichensequenz, die einen Zeiger darstellt.

N/A N/A
void*
N/A N/A N/A N/A N/A N/A
Anmerkungen

Die Gleitkommakonversionsfunktionen konvertieren Unendlichkeit in inf oder infinity. Welche Variante verwendet wird, ist implementierungsabhängig.

Nicht-Zahlen werden in nan oder nan(char_sequence) konvertiert. Welche Variante verwendet wird, ist implementierungsabhängig.

Die Konversionen F, E, G, A geben stattdessen INF, INFINITY, NAN aus.

Der Konvertierungsspezifizierer zum Drucken von char, unsigned char, signed char, short und unsigned short erwartet die typgeförderten Typen von Standard-Argumentförderungen, aber vor dem Drucken seines Wertes wird er in char, unsigned char, signed char, short und unsigned short konvertiert. Es ist sicher, Werte dieser Typen zu übergeben, aufgrund der Förderung, die stattfindet, wenn eine variadische Funktion aufgerufen wird.

Die korrekten Konversionsspezifizierer für zeichenfeste Breiten-Typen (std::int8_t, etc.) sind im Header <cinttypes> definiert (obwohl PRIdMAX, PRIuMAX, etc. synonym mit %jd, %ju, etc. sind).

Der speicherschreibende Konversionsspezifizierer %n ist ein häufiges Ziel von Sicherheitslücken, bei denen Formatzeichenketten von Benutzereingaben abhängen.

Es gibt einen Sequenzpunkt nach der Ausführung jedes Konversionsspezifizierers; dies ermöglicht das Speichern mehrerer %n-Ergebnisse in derselben Variablen oder, als Randfall, das Drucken einer Zeichenkette, die durch ein früheres %n innerhalb desselben Aufrufs modifiziert wurde.

Wenn eine Konversionsspezifikation ungültig ist, ist das Verhalten undefiniert.

[edit] Rückgabewert

1-3) Anzahl der erfolgreich geschriebenen Zeichen oder ein negativer Wert bei einem Fehler.
4) Anzahl der erfolgreich geschriebenen Zeichen oder ein negativer Wert bei einem Fehler. Wenn die resultierende Zeichenkette aufgrund der buf_size-Grenze abgeschnitten wird, gibt die Funktion die Gesamtzahl der Zeichen zurück (ohne das abschließende Null-Byte), die geschrieben worden wären, wenn die Grenze nicht auferlegt worden wäre.

[edit] Hinweise

Alle diese Funktionen rufen mindestens einmal va_arg auf, der Wert von arg ist nach der Rückgabe unbestimmt. Diese Funktionen rufen va_end nicht auf, und dies muss vom Aufrufer erfolgen.

[edit] Beispiel

#include <cstdarg>
#include <cstdio>
#include <ctime>
#include <vector>
 
void debug_log(const char *fmt, ...)
{
    std::time_t t = std::time(nullptr);
    char time_buf[100];
    std::strftime(time_buf, sizeof time_buf, "%D %T", std::gmtime(&t));
    std::va_list args1;
    va_start(args1, fmt);
    std::va_list args2;
    va_copy(args2, args1);
    std::vector<char> buf(1 + std::vsnprintf(nullptr, 0, fmt, args1));
    va_end(args1);
    std::vsnprintf(buf.data(), buf.size(), fmt, args2);
    va_end(args2);
    std::printf("%s [debug]: %s\n", time_buf, buf.data());
}
 
int main()
{
    debug_log("Logging, %d, %d, %d", 1, 2, 3);
}

Ausgabe

04/13/15 15:09:18 [debug]: Logging, 1, 2, 3

[edit] Siehe auch

druckt formatierte Ausgabe nach stdout, einen Dateistream oder einen Puffer
(Funktion) [bearbeiten]
(C++11)(C++11)(C++11)
liest formatierte Eingaben von stdin, einem Dateistream oder einem Puffer
mit variabler Argumentenliste
(function) [bearbeiten]
druckt auf Unicode-fähige stdout oder einen Dateistream unter Verwendung der typ-erased Argumentdarstellung
(Funktion) [bearbeiten]
druckt auf stdout oder einen Dateistream unter Verwendung der typ-erased Argumentdarstellung
(Funktion) [bearbeiten]
C-Dokumentation für vprintf, vfprintf, vsprintf, vsnprintf