printf, fprintf, sprintf, snprintf, printf_s, fprintf_s, sprintf_s, snprintf_s
|
Definiert in Header
<stdio.h>
|
||
| (1) | ||
|
int
printf
(
const
char
*
format, ...
)
;
|
(bis C99) | |
|
int
printf
(
const
char
*
restrict
format, ...
)
;
|
(seit C99) | |
| (2) | ||
|
int
fprintf
(
FILE
*
stream,
const
char
*
format, ...
)
;
|
(bis C99) | |
|
int
fprintf
(
FILE
*
restrict
stream,
const
char
*
restrict
format, ...
)
;
|
(seit C99) | |
| (3) | ||
|
int
sprintf
(
char
*
buffer,
const
char
*
format, ...
)
;
|
(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:
-
-
das Konvertierungsspezifizierer
%nin format vorhanden ist -
eines der Argumente, die
%sentsprechen, ein Nullzeiger ist - stream oder format oder buffer ein Nullzeiger ist
- bufsz null oder größer als RSIZE_MAX ist
- Kodierungsfehler in einem der String- und Zeichenkonvertierungsspezifizierer auftreten
-
(nur für
sprintf_s), der in buffer zu speichernde String (einschließlich des abschließenden Nullzeichens) bufsz überschreiten würde.
-
das Konvertierungsspezifizierer
-
Wie bei allen grenzprüfenden Funktionen sind
printf_s,fprintf_s,sprintf_sundsnprintf_snur garantiert verfügbar, wenn __STDC_LIB_EXT1__ durch die Implementierung definiert ist und wenn der Benutzer __STDC_WANT_LIB_EXT1__ auf den Integer-Konstanten 1 setzt, 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 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
Hinweise
Der C-Standard und
POSIX
spezifizieren, dass das Verhalten von
sprintf
und seinen Varianten undefiniert ist, wenn ein Argument mit dem Zielpuffer überlappt. Beispiel:
sprintf(dst, "%s and %s", dst, t); // <- broken: undefined behavior
POSIX legt fest
, dass
errno
bei Fehlern gesetzt wird. Es spezifiziert auch zusätzliche Konvertierungsangaben, insbesondere Unterstützung für die Neuanordnung von Argumenten (
n$
unmittelbar nach
%
zeigt das
n
te
Argument an).
Der Aufruf von
snprintf
mit einer Null als
bufsz
und einem Nullzeiger für
buffer
ist nützlich, um die erforderliche Puffergröße zur Aufnahme der Ausgabe zu bestimmen:
snprintf_s
, genau wie
snprintf
, aber im Gegensatz zu
sprintf_s
, wird die Ausgabe kürzen, um in
bufsz
-
1
zu passen.
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
|
|