std:: printf, std:: fprintf, std:: sprintf, std:: snprintf
|
Definiert im 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 angegebenen Speicherorten, konvertiert sie in entsprechende Zeichenketten und schreibt die Ergebnisse in verschiedene Senken.
Wenn ein Aufruf von
sprintf
oder
snprintf
dazu führt, dass das Kopieren zwischen Objekten erfolgt, die sich überlappen, ist das Verhalten undefiniert (z.B.
sprintf
(
buf,
"%s text"
, buf
)
;
).
Inhaltsverzeichnis |
Parameter
| stream | - | Ausgabedateistream, in den geschrieben wird |
| buffer | - | Zeiger auf eine Zeichenkette, in die geschrieben wird |
| buf_size | - | bis zu buf_size - 1 Zeichen können geschrieben werden, plus den Nullterminator |
| format | - | Zeiger auf eine nullterminierte Multibyte-Zeichenkette, die angibt, wie die Daten zu interpretieren sind |
| ... | - | Argumente, die die auszugebenden Daten spezifizieren. Wenn ein Argument nach Standardargument-Höherstufung nicht dem von der entsprechenden Konvertierungsangabe erwarteten Typ entspricht (der erwartete Typ ist der höhergestufte Typ oder ein kompatibler Typ des höhergestuften Typs), oder wenn weniger Argumente vorhanden sind als von format benötigt, ist das Verhalten undefiniert. Wenn mehr Argumente vorhanden sind als von format benötigt, werden die überzähligen Argumente ausgewertet und ignoriert |
Der
Format
-String 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 Minus nur bei negativen Ergebnissen vorangestellt). -
space
: Wenn das Ergebnis einer vorzeichenbehafteten Konvertierung nicht mit einem Vorzeichen beginnt oder leer ist, wird ein Leerzeichen dem Ergebnis vorangestellt. Wird ignoriert, wenn das
+Flag vorhanden ist. -
#: Die 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 statt 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 links (bei rechtsbündiger Ausrichtung) oder rechts (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 ist. 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 spezifiziert er den Typ des entsprechenden Arguments).
-
- Konvertierungsformat-Spezifizierer.
Die folgenden Formatbezeichner sind verfügbar:
|
Konvertierung
Spezifizierer |
Erklärung |
Erwarteter
Argumenttyp |
||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Längenmodifikator→ | hh | h | keine | l | ll | j | z | t | L | |
| Nur verfügbar seit C++11→ | 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
|
std::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
std::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
(C++11)
|
Konvertiert Gleitkommazahlen in die Dezimalschreibweise im Format [-]ddd.ddd .
|
N/A | N/A |
double
|
double
(C++11)
|
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
(C++11) |
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
*
|
※
|
N/A | ||
p
|
Schreibt eine implementierungsdefinierte Zeichenfolge, 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 Standardargument-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 Konvertierungsspezifikationen für die festbreiten Zeichentypen (
std::int8_t
usw.) sind im Header
<cinttypes>
definiert (obwohl
PRIdMAX
,
PRIuMAX
usw. synonym mit
Der speicher-schreibende Konvertierungsspezifizierer
Es gibt einen
Sequenzpunkt
nach der Aktion jedes Konvertierungsspezifizierers; dies erlaubt das Speichern mehrerer
Wenn eine Konvertierungsspezifikation ungültig ist, ist das Verhalten undefiniert. |
||||||||||
Rückgabewert
Hinweise
POSIX legt fest
, dass
errno
bei Fehlern gesetzt wird. Es spezifiziert auch zusätzliche Konvertierungsangaben, insbesondere die Unterstützung für die Neuanordnung von Argumenten (
n$
unmittelbar nach
%
zeigt das
n
te
Argument an).
Das Aufrufen von
std::snprintf
mit einer Null als
buf_size
und einem Nullzeiger für
buffer
ist nützlich (wenn der Mehraufwand eines doppelten Aufrufs akzeptabel ist), um die erforderliche Puffergröße zur Aufnahme der Ausgabe zu bestimmen:
auto fmt = "sqrt(2) = %f"; int sz = std::snprintf(nullptr, 0, fmt, std::sqrt(2)); std::vector<char> buf(sz + 1); // Hinweis: +1 für Nullterminator std::sprintf(buf.data(), fmt, std::sqrt(2)); // passt garantiert
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
Siehe auch
|
gibt formatierten Breitzeichen-Output an
stdout
, einen Dateistrom oder einen Puffer aus
(Funktion) |
|
|
gibt formatierten Output an
stdout
, einen Dateistrom oder einen Puffer aus
unter Verwendung einer variablen Argumentenliste (Funktion) |
|
|
schreibt eine Zeichenkette in einen Dateistrom
(Funktion) |
|
|
liest formatierten Input von
stdin
, einem Dateistrom oder einem Puffer
(Funktion) |
|
|
(C++17)
|
konvertiert einen Integer- oder Fließkommawert in eine Zeichensequenz
(Funktion) |
|
(C++23)
|
gibt an
stdout
oder einen Dateistrom unter Verwendung einer
formatierten
Darstellung der Argumente aus
(Funktions-Template) |
|
(C++23)
|
identisch zu
std::print
, außer dass jede Ausgabe durch eine zusätzliche neue Zeile abgeschlossen wird
(Funktions-Template) |
|
C-Dokumentation
für
printf
,
fprintf
,
sprintf
,
snprintf
|
|