printf, fprintf, sprintf, snprintf, printf_s, fprintf_s, sprintf_s, snprintf_s
| Definiert in Header <stdio.h>
|
||
int printf( const char* format, ... );
|
(1) | (bis C99) |
int printf( const char* restrict format, ... );
|
(seit C99) | |
int fprintf( FILE* stream, const char* format, ... );
|
(2) | (bis C99) |
int fprintf( FILE* restrict stream, const char* restrict format, ... );
|
(seit C99) | |
int sprintf( char* buffer, const char* format, ... );
|
(3) | (bis C99) |
int sprintf( char* restrict buffer, const char* restrict format, ... );
|
(seit C99) | |
int snprintf( char* restrict buffer, size_t bufsz,
const char* restrict format, ... );
|
(4) | (seit C99) |
int printf_s( const char* restrict format, ... );
|
(5) | (seit C11) |
int fprintf_s( FILE* restrict stream, const char* restrict format, ... );
|
(6) | (seit C11) |
int sprintf_s( char* restrict buffer, rsize_t bufsz,
const char* restrict format, ... );
|
(7) | (seit C11) |
int snprintf_s( char* restrict buffer, rsize_t bufsz,
const char* restrict format, ... );
|
(8) | (seit C11) |
Lädt die Daten von den angegebenen Speicherorten, konvertiert sie in entsprechende Zeichenketten und schreibt die Ergebnisse in verschiedene Senken/Ströme:
stream.buffer. Das Verhalten ist undefiniert, wenn die zu schreibende Zeichenkette (einschließlich des abschließenden Nullzeichens) die Größe des Arrays überschreitet, auf das buffer verweist.buffer. Es werden höchstens bufsz - 1 Zeichen geschrieben. Die resultierende Zeichenkette wird mit einem Nullzeichen abgeschlossen, es sei denn, bufsz ist Null. Wenn bufsz Null ist, wird nichts geschrieben und buffer darf ein Nullzeiger sein, jedoch wird der Rückgabewert (Anzahl der Bytes, die geschrieben worden wären, ohne das abschließende Nullzeichen) dennoch berechnet und zurückgegeben.- das Umwandlungsformat
%nist informat - vorhandenEines der
%sentsprechenden Argumente ist ein Nullzeiger streamoderformatoderbufferist ein Nullzeigerbufszist Null oder größer als RSIZE_MAX- Kodierungsfehler treten bei Zeichenfolgen- und Zeichenumwandlungsformaten auf
- (nur für
sprintf_s) die inbufferzu speichernde Zeichenkette (einschließlich des abschließenden Nullzeichens) würdebufszüberschreiten.
printf_s, fprintf_s, sprintf_s und snprintf_s nur dann garantiert verfügbar, wenn __STDC_LIB_EXT1__ durch die Implementierung definiert ist und der Benutzer __STDC_WANT_LIB_EXT1__ auf die ganzzahlige Konstante 1 setzt, bevor er <stdio.h> einbindet.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 Byte-String, der 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. |
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 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 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
|
Konvertiert eine vorzeichenlose Ganzzahl in die Oktaldarstellung oooo .
|
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
|
Konvertiert eine Gleitkommazahl in die dezimale Exponentenschreibweise.
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
a
A
(C99) |
Konvertiert eine Gleitkommazahl in die hexadezimale Exponentenschreibweise.
|
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 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 höherstufige 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 Konvertierungsspezifizierer für die festbreiten Zeichentypen (
int8_t
usw.) sind im Header
<inttypes.h>
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
Anmerkungen
Der C-Standard und POSIX legen fest, dass das Verhalten von sprintf und seinen Varianten undefiniert ist, wenn ein Argument den Zielpuffer überlappt. Beispiel:
sprintf(dst, "%s and %s", dst, t); // <- broken: undefined behaviorPOSIX gibt an, dass errno bei einem Fehler gesetzt wird. Es spezifiziert außerdem zusätzliche Formatierungsspezifikationen, insbesondere die Unterstützung für die Neuordnung von Argumenten (n$ unmittelbar nach % kennzeichnet das nte Argument).
Der Aufruf von snprintf mit null bufsz und einem Nullzeiger für buffer ist nützlich, um die erforderliche Puffergröße zur Aufnahme der Ausgabe zu bestimmen:
const char fmt[] = "sqrt(2) = %f";
int sz = snprintf(NULL, 0, fmt, sqrt(2));
char buf[sz + 1]; // note +1 for terminating null byte
snprintf(buf, sizeof buf, fmt, sqrt(2));snprintf_s, genau wie snprintf, aber im Gegensatz zu sprintf_s, schneidet die Ausgabe so ab, dass sie in bufsz - 1 passt.
Beispiel
#include <inttypes.h> #include <stdint.h> #include <stdio.h> int main(void) { const char* s = "Hello"; printf("Strings:\n"); // same as puts("Strings"); printf(" padding:\n"); printf("\t[%10s]\n", s); printf("\t[%-10s]\n", s); printf("\t[%*s]\n", 10, s); printf(" truncating:\n"); printf("\t%.4s\n", s); printf("\t%.*s\n", 3, s); printf("Characters:\t%c %%\n", 'A'); printf("Integers:\n"); printf("\tDecimal:\t%i %d %.6i %i %.0i %+i %i\n", 1, 2, 3, 0, 0, 4,-4); printf("\tHexadecimal:\t%x %x %X %#x\n", 5, 10, 10, 6); printf("\tOctal:\t\t%o %#o %#o\n", 10, 10, 4); printf("Floating-point:\n"); printf("\tRounding:\t%f %.0f %.32f\n", 1.5, 1.5, 1.3); printf("\tPadding:\t%05.2f %.2f %5.2f\n", 1.5, 1.5, 1.5); printf("\tScientific:\t%E %e\n", 1.5, 1.5); printf("\tHexadecimal:\t%a %A\n", 1.5, 1.5); printf("\tSpecial values:\t0/0=%g 1/0=%g\n", 0.0 / 0.0, 1.0 / 0.0); printf("Fixed-width types:\n"); printf("\tLargest 32-bit value is %" PRIu32 " or %#" PRIx32 "\n", UINT32_MAX, UINT32_MAX ); }
Mögliche Ausgabe:
Strings:
padding:
[ Hello]
[Hello ]
[ Hello]
truncating:
Hell
Hel
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
Fixed-width types:
Largest 32-bit value is 4294967295 or 0xffffffff
Referenzen
- C23-Standard (ISO/IEC 9899:2024):
-
- 7.21.6.1 Die fprintf-Funktion (S.: TBD)
-
- 7.21.6.3 Die printf-Funktion (S.: TBD)
-
- 7.21.6.5 Die snprintf-Funktion (S.: TBD)
-
- 7.21.6.6 Die sprintf-Funktion (S.: TBD)
-
- K.3.5.3.1 Die fprintf_s-Funktion (S.: TBD)
-
- K.3.5.3.3 Die printf_s-Funktion (S.: TBD)
-
- K.3.5.3.5 Die snprintf_s-Funktion (S.: TBD)
-
- K.3.5.3.6 Die sprintf_s-Funktion (S.: TBD)
- C17-Standard (ISO/IEC 9899:2018):
-
- 7.21.6.1 Die fprintf-Funktion (S. 225-230)
-
- 7.21.6.3 Die printf-Funktion (S. 236)
-
- 7.21.6.5 Die snprintf-Funktion (S. 237)
-
- 7.21.6.6 Die sprintf-Funktion (S. 237)
-
- K.3.5.3.1 Die fprintf_s-Funktion (S. 430)
-
- K.3.5.3.3 Die printf_s-Funktion (S. 432)
-
- K.3.5.3.5 Die snprintf_s-Funktion (S. 432-433)
-
- K.3.5.3.6 Die sprintf_s-Funktion (S. 433)
- C11-Standard (ISO/IEC 9899:2011):
-
- 7.21.6.1 Die fprintf-Funktion (S. 309-316)
-
- 7.21.6.3 Die printf-Funktion (S. 324)
-
- 7.21.6.5 Die snprintf-Funktion (S. 325)
-
- 7.21.6.6 Die sprintf-Funktion (S. 325-326)
-
- K.3.5.3.1 Die fprintf_s-Funktion (S. 591)
-
- K.3.5.3.3 Die printf_s-Funktion (S. 593-594)
-
- K.3.5.3.5 Die snprintf_s-Funktion (S. 594-595)
-
- K.3.5.3.6 Die sprintf_s-Funktion (S. 595-596)
- C99-Standard (ISO/IEC 9899:1999):
-
- 7.19.6.1 Die fprintf-Funktion (S. 274-282)
-
- 7.19.6.3 Die printf-Funktion (S. 290)
-
- 7.19.6.5 Die snprintf-Funktion (S. 290-291)
-
- 7.19.6.6 Die sprintf-Funktion (S. 291)
- C89/C90 Standard (ISO/IEC 9899:1990):
-
- 4.9.6.1 Die fprintf-Funktion
-
- 4.9.6.3 Die printf-Funktion
-
- 4.9.6.5 Die sprintf-Funktion
Siehe auch
|
(C95)
(C95)
(C95)
(C11)
(C11)
(C11)
(C11)
|
gibt formatierten Breitzeichen-Output an
stdout
, einen Dateistrom oder einen Puffer aus
(Funktion) |
|
(C99)
(C11)
(C11)
(C11)
(C11)
|
gibt formatierten Output an
stdout
, einen Dateistrom oder einen Puffer aus
unter Verwendung einer variablen Argumentenliste (Funktion) |
|
schreibt eine Zeichenkette in einen Dateistrom
(Funktion) |
|
|
(C11)
(C11)
(C11)
|
liest formatierten Input von
stdin
, einem Dateistrom oder einem Puffer
(Funktion) |
|
C++-Dokumentation
für
printf
,
fprintf
,
sprintf
,
snprintf
|
|