std::printf, std::fprintf, std::sprintf, std::snprintf
| Definiert in Header <cstdio> |
||
| int printf( const char* format, ... ); |
(1) | |
| int fprintf( std::FILE* stream, const char* format, ... ); |
(2) | |
| int sprintf( char* buffer, const char* format, ... ); |
(3) | |
| int snprintf( char* buffer, std::size_t buf_size, const char* format, ... ); |
(4) | (seit C++11) |
Lädt die Daten von den gegebenen Orten, konvertiert sie in Zeichenketten-Äquivalente und schreibt die Ergebnisse in eine Vielzahl von Senken.
Wenn ein Aufruf von sprintf oder snprintf dazu führt, dass Kopieroperationen zwischen überlappenden Objekten stattfinden, ist das Verhalten undefiniert (z.B. sprintf(buf, "%s text", buf);).
Inhalt |
[edit] Parameter
| stream | - | Ausgabestream, in den geschrieben werden soll |
| buffer | - | Zeiger auf eine Zeichenkette, in die geschrieben werden soll |
| buf_size | - | bis zu buf_size - 1 Zeichen können geschrieben werden, zuzüglich des Nullterminators |
| format | - | Zeiger auf eine null-terminierte Multibyte-Zeichenkette, die angibt, wie die Daten interpretiert werden sollen |
| ... | - | Argumente, die die zu druckenden Daten spezifizieren. Wenn ein Argument nach den Standard-Argument-Promotions nicht dem erwarteten Typ für die entsprechende Konversionsspezifikation entspricht (der erwartete Typ ist der promotionierte Typ oder ein kompatibler Typ des promotionierten Typs), oder wenn es weniger Argumente als von format gefordert gibt, ist das Verhalten undefiniert. Wenn es mehr Argumente gibt als von format gefordert, werden die zusätzlichen Argumente ausgewertet und ignoriert. |
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.
- ein einführendes
- (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) ein Ganzzahlwert oder
- (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)
- (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.
|
N/A | N/A | int |
std::wint_t |
N/A | N/A | N/A | N/A | N/A |
s
|
Schreibt eine Zeichenkette.
|
N/A | N/A | char* |
wchar_t* |
N/A | N/A | N/A | N/A | N/A |
di
|
Konvertiert eine vorzeichenbehaftete Ganzzahl in die Dezimaldarstellung [-]dddd.
|
signed char |
short |
int |
long |
long long |
※ |
N/A | ||
o
|
Konvertiert eine vorzeichenlose Ganzzahl in die Oktaldarstellung oooo.
|
unsigned char |
unsigned short |
unsigned int |
unsigned long |
unsigned long long |
vorzeichenlose Version von std::ptrdiff_t |
N/A | ||
xX
|
Konvertiert eine vorzeichenlose Ganzzahl in die Hexadezimaldarstellung hhhh.
|
N/A | ||||||||
u
|
Konvertiert eine vorzeichenlose Ganzzahl in die Dezimaldarstellung dddd.
|
N/A | ||||||||
fF (C++11)
|
Konvertiert eine Gleitkommazahl in die Dezimalnotation im Stil [-]ddd.ddd.
|
N/A | N/A | double |
double (C++11) |
N/A | N/A | N/A | N/A | long double |
eE
|
Konvertiert eine Gleitkommazahl in die Dezimal-Exponent-Notation.
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
aA
(C++11) |
Konvertiert eine Gleitkommazahl in die Hexadezimal-Exponent-Notation.
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
gG
|
Konvertiert eine Gleitkommazahl je nach Wert und Genauigkeit in die Dezimal- oder Dezimal-Exponent-Notation.
|
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.
|
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 Nicht-Zahlen werden in Die Konversionen Die Konversionsspezifizierer zur Ausgabe von char, unsigned char, signed char, short und unsigned short erwarten promotionierte Typen gemäß den Standard-Argument-Promotions, aber bevor ihr Wert ausgegeben wird, wird er in char, unsigned char, signed char, short und unsigned short konvertiert. Es ist sicher, Werte dieser Typen zu übergeben, da die Promotion 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 Der speicherschreibende Konversionsspezifizierer Es gibt einen Sequenzpunkt nach der Ausführung jedes Konversionsspezifizierers; dies ermöglicht das Speichern mehrerer Wenn eine Konversionsspezifikation ungültig ist, ist das Verhalten undefiniert. | ||||||||||
[edit] Rückgabewert
[edit] Anmerkungen
POSIX schreibt vor, dass errno bei einem Fehler gesetzt wird. Es schreibt auch zusätzliche Konversionsspezifikationen vor, insbesondere die Unterstützung für Argument-Reihenfolge (n$ unmittelbar nach % kennzeichnet das n-te Argument).
Das Aufrufen von std::snprintf mit null buf_size und einem Nullzeiger für buffer ist nützlich (wenn der Overhead eines doppelten Aufrufs akzeptabel ist), um die notwendige Puffergröße zu ermitteln, um die Ausgabe aufzunehmen.
auto fmt = "sqrt(2) = %f"; int sz = std::snprintf(nullptr, 0, fmt, std::sqrt(2)); std::vector<char> buf(sz + 1); // note +1 for null terminator std::sprintf(buf.data(), fmt, std::sqrt(2)); // certain to fit
[edit] Beispiel
#include <cinttypes> #include <cstdint> #include <cstdio> #include <limits> int main() { const char* s = "Hello"; std::printf("Strings:\n"); // same as std::puts("Strings:"); std::printf("\t[%10s]\n", s); std::printf("\t[%-10s]\n", s); std::printf("\t[%*s]\n", 10, s); std::printf("\t[%-10.*s]\n", 4, s); std::printf("\t[%-*.*s]\n", 10, 4, s); std::printf("Characters:\t%c %%\n", 'A'); std::printf("Integers:\n"); std::printf("\tDecimal: \t%i %d %.6i %i %.0i %+i %i\n", 1, 2, 3, 0, 0, 4,-4); std::printf("\tHexadecimal:\t%x %x %X %#x\n", 5,10,10, 6); std::printf("\tOctal: \t%o %#o %#o\n", 10, 10, 4); std::printf("Floating point:\n"); std::printf("\tRounding:\t%f %.0f %.32f\n", 1.5, 1.5, 1.3); std::printf("\tPadding:\t%05.2f %.2f %5.2f\n", 1.5, 1.5, 1.5); std::printf("\tScientific:\t%E %e\n", 1.5, 1.5); std::printf("\tHexadecimal:\t%a %A\n", 1.5, 1.5); std::printf("\tSpecial values:\t0/0=%g 1/0=%g\n", 0.0/0.0, 1.0/0.0); std::printf("Variable width control:\n"); std::printf("\tright-justified variable width: '%*c'\n", 5, 'x'); int r = std::printf("\tleft-justified variable width : '%*c'\n", -5, 'x'); std::printf("(the last printf printed %d characters)\n", r); std::printf("Fixed-width types:\n"); std::uint32_t val = std::numeric_limits<std::uint32_t>::max(); std::printf("\tLargest 32-bit value is %" PRIu32 " or %#" PRIx32 "\n", val, val); }
Mögliche Ausgabe
Strings: [ Hello] [Hello ] [ Hello] [Hell ] [Hell ] Characters: A % Integers: Decimal: 1 2 000003 0 +4 -4 Hexadecimal: 5 a A 0x6 Octal: 12 012 04 Floating point: Rounding: 1.500000 2 1.30000000000000004440892098500626 Padding: 01.50 1.50 1.50 Scientific: 1.500000E+00 1.500000e+00 Hexadecimal: 0x1.8p+0 0X1.8P+0 Special values: 0/0=-nan 1/0=inf Variable width control: right-justified variable width: ' x' left-justified variable width : 'x ' (the last printf printed 41 characters) Fixed-width types: Largest 32-bit value is 4294967295 or 0xffffffff
[edit] Siehe auch
| druckt formatierte breite Zeichen-Ausgabe nach stdout, einem Dateistream oder einem Puffer (Funktion) | |
| druckt formatierte Ausgabe nach stdout, einen Dateistream oder einen Puffer mit variabler Argumentenliste (function) | |
| schreibt einen Zeichenstring in einen Dateistream (function) | |
| liest formatierte Eingaben von stdin, einem Dateistream oder einem Puffer (Funktion) | |
| (C++17) |
konvertiert einen Ganzzahl- oder Gleitkommawert in eine Zeichensequenz (Funktion) |
| (C++23) |
druckt nach stdout oder einem Dateistream unter Verwendung der formatierten Darstellung der Argumente (Funktionstemplate) |
| (C++23) |
dasselbe wie std::print, außer dass jeder Druck durch eine zusätzliche neue Zeile beendet wird (Funktionstemplate) |
| C-Dokumentation für printf, fprintf, sprintf, snprintf
| |