Formatspezifikationssyntax: printf und wprintf -Funktionen

Die verschiedenen printf- und wprintf-Funktionen nehmen eine Formatzeichenfolge sowie optionale Argumente an und generieren eine formatierte Zeichenfolgensequenz für die Ausgabe. Die Formatzeichenfolge enthält 0 oder mehr Anweisungen, die entweder literale Zeichen für die Ausgabe oder codierte Konvertierungsangaben sind, die beschreiben, wie ein Argument in der Ausgabe formatiert wird. Dieser Artikel beschreibt die Syntax, die zum Codieren von Konvertierungsangaben in der Formatzeichenfolge verwendet wird. Eine Auflistung dieser Funktionen finden Sie unter Stream E/A.

Eine Konvertierungsangabe besteht aus optionalen Feldern und Pflichtfeldern in folgender Form:

%[flags][width][.precision][size]type

Jedes Feld der Konvertierungsangabe ist entweder ein Zeichen oder eine Zahl, das bzw. die eine bestimmte Formatoption oder Konvertierungsspezifizierer darstellt. Das erforderliche Typfeld gibt die Art der Konvertierung an, die an einem Argument vorgenommen wird. Die optionalen Flag-, Breiten- und Genauigkeitsfelder steuern andere Formataspekte wie führende Leerzeichen oder Nullen, Begründung und angezeigte Genauigkeit. Das Feld size gibt die Größe des verwendeten und konvertierten Arguments an.

Eine grundlegende Formatspezifikation enthält nur das Prozentzeichen und ein Typzeichen. %s gibt z.B. eine Zeichenfolgenkonvertierung an. Um ein Prozentzeichen zu drucken, verwenden Sie %%. Es wird ein ungültiger Parameterhandler aufgerufen, wenn einem Prozentzeichen ein Zeichen folgt, das keine Bedeutung für ein Formatfeld hat. Weitere Informationen finden Sie unter Parametervalidierung.

Wichtig

Stellen Sie aus Sicherheits- und Stabilitätsgründen sicher, dass die Formatkonvertierungsspezifikationszeichenfolgen nicht vom Endbenutzer definiert sind. Beispiel: Ein Programm, das den Benutzer zur Eingabe eines Namens auffordert und die Eingabe in einer Zeichenfolgevariablen namens user_name speichert. Um zu drucken user_name, gehen Sie niemals wie folgt vor:

printf( user_name ); /* Danger! If user_name contains "%s", program will crash */

Sondern gehen Sie stattdessen so vor:

printf( "%s", user_name );

Hinweis

In Visual Studio 2015 wurden die printf Funktionen und scanf als deklariert inline und in die <stdio.h> Header und <conio.h> verschoben. Wenn Sie älteren Code migrieren, wird möglicherweise LNK2019 in Verbindung mit diesen Funktionen angezeigt. Weitere Informationen finden Sie unter Visual C++-Änderungsverlauf 2003 - 2015.

Typkonvertierungsspezifizierer

Das Typ-Konvertierungsspezifiziererzeichen gibt an, ob das entsprechende Argument als Zeichen, Zeichenfolge, Zeiger, ganze Zahl oder Gleitkommazahl interpretiert werden soll. Das Typzeichen ist das einzige erforderliche Konvertierungsangabenfeld und erscheint nach allen optionalen Feldern.

Die Argumente, die der Formatzeichenfolge folgen, werden entsprechend dem entsprechenden Typzeichen und dem optionalen Größenpräfix interpretiert. Konvertierungen für Zeichentypen char und wchar_t werden mit c oder Cangegeben, und Einzelbyte- und Multibyte- oder Breitzeichenzeichenfolgen werden mithilfe s von oder Sangegeben, je nachdem, welche Formatierungsfunktion verwendet wird. Zeichen- und Zeichenfolgenargumente, die mithilfe c von und s angegeben werden, werden als char und char* von printf Familienfunktionen oder als wchar_t und wchar_t* von wprintf Familienfunktionen interpretiert. Zeichen- und Zeichenfolgenargumente, die mithilfe C von und S angegeben werden, werden als wchar_t und wchar_t* von printf Familienfunktionen oder als char und char* von wprintf Familienfunktionen interpretiert. Dieses Verhalten ist Microsoft-spezifisch. Aus historischen Gründen verwenden c die wprintf Funktionen unds, um auf Zeichen zu wchar_t verweisen, und C und S geben Schmalzeichen an.

Ganzzahlige Typen wie , , , und deren unsigned Varianten werden mithilfe dvon , , i, ou, xund Xangegeben. long longlongintshort Gleitkommatypen wie float, doubleund long doublewerden mithilfe avon , , A, e, E, f, gFund Gangegeben. Wenn sie nicht durch ein Größenpräfix geändert werden, werden ganzzahlige Argumente standardmäßig in den int Typ umgewandelt, und Gleitkommaargumente werden in doubleumgewandelt. Auf 64-Bit-Systemen ist ein int 32-Bit-Wert. 64-Bit-Ganzzahlen werden also abgeschnitten, wenn sie für die Ausgabe formatiert werden, es sei denn, es wird ein Größenpräfix von ll oder I64 verwendet. Zeigertypen, die durch p angegeben werden, verwenden die Standardzeigergröße für die Plattform.

Hinweis

Microsoft-spezifisch:
Das Z Typzeichen und das Verhalten der cTypzeichen , Cs, undS, wenn sie mit den printf Funktionen und wprintf verwendet werden, sind Microsoft-Erweiterungen. Der ISO C-Standard verwendet c und s konsistent für schmale Zeichen und Zeichenfolgen sowie C und S für Breitzeichen und Zeichenfolgen in allen Formatierungsfunktionen.

Typenfeldzeichen

Typzeichen Argument Ausgabeformat
c Zeichen Gibt bei Verwendung mit printf-Funktionen ein Einzelbytezeichen und bei Verwendung mit wprintf-Funktionen ein Breitzeichen an.
C Zeichen Gibt bei Verwendung mit printf-Funktionen ein Breitzeichen und bei Verwendung mit wprintf-Funktionen ein Einzelbytezeichen an.
d Ganze Zahl Ganze Dezimalzahl mit Vorzeichen
i Ganze Zahl Ganze Dezimalzahl mit Vorzeichen
o Ganze Zahl Oktale ganze Zahl ohne Vorzeichen
u Ganze Zahl Ganze Dezimalzahl ohne Vorzeichen
x Ganze Zahl Hexadezimalzahl ohne Vorzeichen; verwendet "abcdef".
X Ganze Zahl Hexadezimalzahl ohne Vorzeichen; verwendet "ABCDEF".
e Gleitkomma Vorzeichenwert mit der Form [-]d.dddde[+|-]ddd[d], wobei d eine Dezimalziffer ist, dddd eine oder mehrere Dezimalstellen abhängig von der angegebenen Genauigkeit oder standardmäßig sechs und dd[d] zwei oder drei Dezimalstellen sind, abhängig vom Ausgabeformat und der Größe des Exponenten.
E Gleitkomma Identisch mit dem e Format, mit der Ausnahme, dass E anstelle e des Exponenten eingeführt wird.
f Gleitkomma Signierter Wert im Format [-]ddddd.dddd, wobei dddd eine oder mehrere Dezimalstellen ist. Die Anzahl der Ziffern vor dem Dezimaltrennzeichen ist abhängig von der Größe der Zahl, und die Anzahl der Ziffern nach dem Dezimaltrennzeichen ist abhängig von der angeforderten Genauigkeit oder standardmäßig sechs.
F Gleitkomma Identisch mit dem f Format, außer dass unendliche und NaN-Ausgabe großgeschrieben wird.
g Gleitkomma Signierte Werte werden in oder e im f Format angezeigt, je nachdem, was für den angegebenen Wert und die angegebene Genauigkeit kompakter ist. Das e Format wird nur verwendet, wenn der Exponent des Werts kleiner als -4 oder größer oder gleich dem Genauigkeitsargument ist. Nachfolgende Nullen werden abgeschnitten, und das Dezimaltrennzeichen wird nur angezeigt, wenn eine oder mehrere Ziffern darauf folgen.
G Gleitkomma Identisch mit dem Format, mit der g Ausnahme, dass Eanstelle evon den Exponenten eingeführt wird (falls zutreffend).
a Gleitkomma Hexadezimalwert mit doppelter Genauigkeit mit Vorzeichen, der die Form [-]0xh.hhhhp[|-+]dd hat, wobei h.hhhh die Hexadezimalstellen (mit Kleinbuchstaben) der Mantisse und dd eine oder mehrere Ziffern für den Exponenten sind. Die Genauigkeit gibt die Anzahl der Ziffern nach dem Punkt an.
A Gleitkomma Hexadezimalwert mit doppelter Genauigkeit mit Vorzeichen, der die Form [-]0Xh.hhhhP[|-+]dd hat, wobei h.hhhh die Hexadezimalstellen (mit Großbuchstaben) der Mantisse und dd eine oder mehrere Ziffern für den Exponenten sind. Die Genauigkeit gibt die Anzahl der Ziffern nach dem Punkt an.
n Zeiger auf eine ganze Zahl Anzahl der Zeichen, die bisher erfolgreich in den Stream oder Puffer geschrieben wurden. Dieser Wert wird in der ganzen Zahl gespeichert, deren Adresse als Argument angegeben ist. Die Größe des Integers, auf den gezeigt wird, kann durch ein Präfix mit Argumentengrößenangabe gesteuert werden. Der n-Bezeichner ist standardmäßig deaktiviert. Weitere Informationen finden Sie im wichtigen Sicherheitshinweis.
p Zeigertyp Zeigt das Argument als Adresse in Hexadezimalstellen an.
s String Gibt bei Verwendung mit printf-Funktionen eine Einzelbyte- oder Multibyte-Zeichenfolge und bei Verwendung mit wprintf-Funktionen eine Breitzeichenfolge an. Zeichen werden bis zum ersten NULL-Zeichen oder bis zum precision-Wert angezeigt.
S String Gibt bei Verwendung mit printf-Funktionen eine Breitzeichenfolge und bei Verwendung mit wprintf-Funktionen eine Einzelbyte- oder Multibyte-Zeichenfolge an. Zeichen werden bis zum ersten NULL-Zeichen oder bis zum precision-Wert angezeigt.
Z ANSI_STRING- oder UNICODE_STRING-Struktur VS 2013 und früher
Wenn die Adresse einer ANSI_STRING - oder UNICODE_STRING -Struktur als Argument übergeben wird, zeigen Sie die im Puffer enthaltene Zeichenfolge an, auf die das Buffer Feld der -Struktur verweist. Verwenden Sie ein Größenmodifiziererpräfix vonw, um ein UNICODE_STRING Argument anzugeben, %wZz. B. . Das Length-Feld der Struktur muss auf die Länge der Zeichenfolge in Bytes festgelegt sein. Das MaximumLength-Feld der Struktur muss auf die Länge des Puffers in Bytes festgelegt sein.

Universelle C-Runtime (UCRT)
Es gibt ein bekanntes Problem im UCRT, das derzeit aus Kompatibilitätsgründen verwaltet wird. Wie der S Spezifizierer bezieht sich der Z Spezifizierer ohne Größenmodifiziererpräfix auf ein UNICODE_STRING , wenn eine schmale Druckfunktion (z printf. B. ) verwendet wird, und ein bei ANSI_STRING Verwendung einer breiten Druckfunktion (z. B wprintf. ).
Verwenden Sie anstelle von Z, um eine ANSI_STRINGanzugeben.hZ wZ (oder lZ) kann weiterhin verwendet werden, um eine UNICODE_STRINGanzugeben.

In der Regel wird das Z Typzeichen nur in Treiberdebugfunktionen verwendet, die eine Konvertierungsspezifikation verwenden, z dbgPrint . B. und kdPrint.

Wenn in Visual Studio 2015 und höheren Versionen das Argument, das einem Gleitkommakonvertierungsspezifizierer (a, A, eE, f, gF, ) Gentspricht, unendlich, unbegrenzt oder NaN ist, entspricht die formatierte Ausgabe dem C99-Standard. In dieser Tabelle ist die formatierte Ausgabe aufgeführt:

Wert Output
Unendlich inf
Stiller NaN nan
Signalisierender NaN nan(snan)
Unbestimmter NaN nan(ind)

Jeder dieser Zeichenfolgen kann ein Vorzeichen vorangestellt werden. Wenn ein Gleitkomma-Konvertierungsspezifizierertyp ein Großbuchstabe ist,dann wird die Ausgabe auch in Großbuchstaben formatiert. Wenn der Formatbezeichner beispielsweise %F statt %f ist, wird infinity als INF statt inf formatiert. Die scanf-Funktionen können diese Zeichenfolgen auch analysieren, damit diese Werte einen Roundtrip für printf- und scanf-Funktionen durchführen können.

Vor Visual Studio 2015 verwendete die CRT ein anderes, Nicht-Standard-Format für die Ausgabe von unendlichen, unbestimmten oder NaN-Werten:

Wert Output
+ Unendlich 1.#INFrandom-digits
-Unendlichkeit -1.#INFrandom-digits
unbestimmt (mit stillem NaN identisch) Ziffer.#INDZufällige Ziffern
NaN Ziffer.#NANZufällige Ziffern

Jede dieser Zeichenfolgen hat möglicherweise ein Vorzeichen vorangestellt und wurde je nach Feldbreite und Genauigkeit möglicherweise unterschiedlich formatiert, manchmal mit ungewöhnlichen Effekten. Beispielsweise druckt1.#J, printf("%.2f\n", INFINITY) weil die #INF auf zwei Ziffern der Genauigkeit "gerundet" wird.

Hinweis

Wenn das Argument, das %s oder %S oder dem Buffer-Feld des Arguments entspricht, das %Z entspricht, ein NULL-Zeiger „(NULL)“ ist, wird es angezeigt.

Hinweis

In allen Exponentialformaten beträgt die Anzahl der Ziffern des Exponenten, der angezeigt wird, zwei. Es werden nur wenn nötig drei verwendet. Mithilfe der _set_output_format -Funktion können Sie die Anzahl der angezeigten Ziffern auf drei festlegen, um die Abwärtskompatibilität mit Code zu gewährleisten, der für Visual Studio 2013 und davor geschrieben wurde.

Wichtig

Da das %n Format grundsätzlich unsicher ist, ist es standardmäßig deaktiviert. Wenn %n in einer Formatzeichenfolge gefunden wird, wird der Handler für ungültige Parameter aufgerufen, wie unter Parameterüberprüfung beschrieben. Informationen zum Aktivieren der %n Unterstützung finden Sie unter _set_printf_count_output.

Flag-Direktiven

Das erste optionale Feld in einer Konvertierungsspezifikation enthält Flagdirektiven. Dieses Feld enthält null oder mehr Flagzeichen, die die Ausgabeausrichtung angeben und die Ausgabe von Zeichen, Leerzeichen, führenden Nullen, Dezimalstellen sowie oktalen und hexadezimalen Präfixen steuern. In einer Konvertierungsangabe können mehr als eine Flag-Anweisung erscheinen, und die Flag-Zeichen können in beliebiger Reihenfolge dargestellt werden.

Flag-Zeichen

Flag Bedeutung Standard
- Das Ergebnis mit der angegebenen Feldweite ist linksbündig. Rechtsbündig.
+ Verwenden Sie ein Zeichen (+ oder -), um dem Ausgabewert ein Präfix zu geben, wenn er einen signierten Typ aufweist. Das Vorzeichen taucht nur für negative Werte mit Vorzeichen (-) auf.
0 Wenn width mit 0vorangestellt wird, werden führende Nullen hinzugefügt, bis die Mindestbreite erreicht ist. Wenn sowohl als - auch 0 angezeigt werden, wird ignoriert0. Wenn 0 für ein Ganzzahlformat (i, , ux, X, o) dangegeben ist und auch eine Genauigkeitsspezifikation vorhanden ist, z. B. , %04.d0 wird ignoriert. Wenn 0 für das a Gleitkommaformat oder A angegeben ist, werden führende Nullen der Mantisse nach dem 0x Präfix oder 0X vorangestellt. Keine Auffüllung.
leer (' ') Verwenden Sie ein leeres , um dem Ausgabewert ein Präfix zu setzen, wenn er signiert und positiv ist. Das Leerzeichen wird ignoriert, wenn jeweils das Leerzeichen- und das „+“-Flag erscheinen. Es wird kein Leerzeichen angezeigt.
# Wenn es mit dem oFormat , xoder X verwendet wird, verwendet 0das # Flag , 0xbzw0X. , um jedem Ausgabewert ungleich null ein Präfix zu setzen. Es wird kein Präfix angezeigt.
Wenn es mit dem eFormat , , fE, F, aoder A verwendet wird, erzwingt das # Flag, dass der Ausgabewert ein Dezimaltrennzeichen enthält. Dezimaltrennzeichen werden nur dann angezeigt, wenn Ziffern darauf folgen.
Wenn es mit dem g Format oder G verwendet wird, erzwingt das # Flag, dass der Ausgabewert ein Dezimaltrennzeichen enthält, und verhindert das Abschneiden von nachfolgenden Nullen.

Wird ignoriert, wenn es mit c, , di, uoder sverwendet wird.
Dezimaltrennzeichen werden nur dann angezeigt, wenn Ziffern darauf folgen. Nachfolgende Nullen werden abgeschnitten.

Breitenangabe

In einer Konvertierungsangabe, erscheint das optionale Feld für die Breitenangabe nach jedem flags-Zeichen. Das width Argument ist eine nicht negative Dezimalzahl, die die Mindestanzahl der ausgegebenen Zeichen steuert. Wenn die Anzahl der Zeichen im Ausgabewert kleiner als die angegebene Breite ist, werden Leerzeichen links oder rechts neben den Werten hinzugefügt – je nachdem, ob das Flag der Linksausrichtung (-) angegeben ist – bis die Mindestbreite erreicht ist. Wenn width durch 0 vorangestellt wird, werden führende Nullen zu Ganzzahl- oder Gleitkommakonvertierungen hinzugefügt, bis die Mindestbreite erreicht ist, außer wenn die Konvertierung in eine Unendlichkeit oder NaNerfolgt.

Die Breitenangabe sorgt nie dafür, dass ein Wert abgeschnitten wird. Wenn die Anzahl der Zeichen im Ausgabewert größer als die angegebene Breite ist oder nicht width angegeben wird, werden alle Zeichen des Werts gemäß der Genauigkeitsspezifikation ausgegeben.

Wenn die Genauigkeitsangabe ein Sternchen (*) ist, stellt ein int-Argument aus der Argumentliste den Wert bereit. Das width Argument muss dem Wert vorangestellt werden, der in der Argumentliste formatiert wird, wie in diesem Beispiel gezeigt:

printf("%0*d", 5, 3); /* 00003 is output */

Ein fehlender oder kleiner width Wert in einer Konvertierungsspezifikation führt nicht zum Abschneiden eines Ausgabewerts. Wenn das Ergebnis einer Konvertierung größer als der width Wert ist, wird das Feld erweitert, um das Konvertierungsergebnis zu enthalten.

Genauigkeitsangabe

In einer Konvertierungsangabe gibt das dritte optionale Feld die Genauigkeit an. Sie besteht aus einem Punkt (.) gefolgt von einer nicht negativen Dezimalzahl, die je nach Konvertierungstyp die Anzahl der Zeichenfolgenzeichen, die Anzahl der Dezimalstellen oder die Anzahl der auszugebenden signifikanten Ziffern angibt.

Im Gegensatz zu den Breitenangabe kann die Genauigkeitsangabe den Ausgabewert abschneiden oder auf einen Gleitkommawert aufrunden. Wenn precision als 0 angegeben ist und der zu konvertierende Wert 0 ist, werden keine Zeichen ausgegeben, wie in diesem Beispiel gezeigt:

printf( "%.0d", 0 ); /* No characters output */

Wenn die Genauigkeitsangabe ein Sternchen (*) ist, stellt ein int-Argument aus der Argumentliste den Wert bereit. In der Argumentliste muss das precision-Argument vor dem Wert stehen, der formatiert wird, wie im folgenden Beispiel gezeigt:

printf( "%.*f", 3, 3.14159265 ); /* 3.142 output */

Das type Zeichen bestimmt entweder die Interpretation von precision oder die Standardgenauigkeit, wenn precision nicht angegeben wird, wie in der folgenden Tabelle gezeigt.

Auswirkungen von Genauigkeitswerten auf den Typ

type Bedeutung Standard
a, A Die Genauigkeit gibt die Anzahl der Ziffern nach dem Punkt an. Die Standardgenauigkeit beträgt 13. Wenn die Genauigkeit 0 beträgt, wird kein Dezimaltrennzeichen gedruckt, es sei denn, das #-Flag wird verwendet.
c, C Die Genauigkeit hat keine Auswirkung. Zeichen wird gedruckt.
d, i, o, u, x, X Die Genauigkeit gibt die minimale Anzahl der zu druckenden Ziffern an. Wenn die Anzahl der Ziffern im Argument kleiner als precision ist, wird der Ausgabewert auf der linken Seite mit Nullen aufgefüllt. Der Wert wird nicht abgeschnitten, wenn die Anzahl der Ziffern die Genauigkeit überschreitet. Die Standardgenauigkeit beträgt 1.
e, E Die Genauigkeit gibt die Anzahl der zu druckenden Ziffern nach dem Dezimaltrennzeichen an. Die letzte gedruckte Ziffer ist gerundet. Die Standardgenauigkeit beträgt 6. Wenn die Genauigkeit 0 ist oder der Punkt (.) ohne eine Zahl angezeigt wird, wird kein Dezimaltrennzeichen ausgegeben.
f, F Der Genauigkeitswert gibt die Anzahl der Ziffern nach dem Dezimaltrennzeichen an. Wenn ein Dezimaltrennzeichen angezeigt wird, wird mindestens eine Ziffer davor angezeigt. Der Wert wird auf die entsprechende Anzahl an Stellen gerundet. Die Standardgenauigkeit beträgt 6. Wenn die Genauigkeit 0 ist oder der Punkt (.) ohne eine Zahl darauf angezeigt wird, wird kein Dezimaltrennzeichen gedruckt.
g, G Die Genauigkeit gibt die maximale Anzahl an gedruckten signifikanten Stellen an. Sechs signifikante Stellen werden gedruckt, und nachfolgende Nullen werden abgeschnitten.
s, S Die Genauigkeit gibt die maximale Anzahl der zu druckenden Zeichen an. Es werden nicht mehr als precision Zeichen gedruckt. Zeichen werden gedruckt, bis ein NULL-Zeichen gefunden wird.

Angabe der Argumentgröße

In einer Konvertierungsangabe ist das size-Feld ein Argumentlängenmodifizierer für den Konvertierungsspezifizierertyp. Die Größenfeldpräfixe für das Typfeldhh , h, j( l Kleinbuchstaben L), L, tllw, z( I Großbuchstaben i), I32und I64– geben die "Größe" des entsprechenden Arguments an – lang oder kurz, 32-Bit- oder 64-Bit-, Einbyte- oder Breitzeichen – je nach geändertem Konvertierungsspezifizierer. Diese Größenpräfixe werden zusammen mit Typzeichen in den Familien printf und wprintf der Funktionen verwendet, um der Interpretation von Argumentlängen gemäß der Darstellung in der folgenden Tabelle anzugeben. Das size-Feld ist für einige Argumenttypen optional. Wenn kein Größenpräfix angegeben ist, konsumiert das Formatierungsprogramm ganzzahlige Argumente, z.B. char, short, int, long mit oder ohne Vorzeichen und Aufzählungstypen, wie etwa 32-Bit int-Typen und float, double sowie long double, während Gleitkommaargumente als 64-Bit-double-Typen konsumiert werden. Dieses Verhalten stimmt mit den standardmäßigen Typerweiterungsregeln für Listen von Variablenargumenten überein. Weitere Informationen zur Argumentaufstufung finden Sie unter Auslassungspunkte und Standardargumente in Postfix-Ausdrücken. Auf 32-Bit- und 64-Bit-Systemen muss die Konvertierungsspezifikation eines 64-Bit-Ganzzahlarguments das Größenpräfix ll oder I64enthalten. Andernfalls ist das Verhalten des Formatierungsprogramms nicht definiert.

Einige Typen weisen in 32-Bit- und 64-Bit-Code verschiedene Größen auf. Beispielsweise ist size_t in für x86-Systeme kompiliertem Code 32 Bit lang, bei Code für X64-Systeme jedoch 64 Bit lang. Zum Erstellen von plattformunabhängigem Formatierungscode für Typen mit variabler Breite können Sie einen Argumentgrößenmodifizierer mit variabler Breite verwenden. Verwenden Sie stattdessen einen 64-Bit-Argumentgrößenmodifizierer, und stufen Sie den Argumenttyp mit variabler Breite explizit auf 64 Bit höher. Der Microsoft-spezifische I Argumentgrößenmodifizierer (Großbuchstaben i) verarbeitet ganzzahlige Argumente mit variabler Breite, es wird jedoch empfohlen, die typspezifischen jModifizierer , tund z für die Portabilität zu verwenden.

Größenpräfixe für Formattypbezeichner printf und wprintf

Angabe von Präfix Mit Typspezifizierer
char
unsigned char
hh d, i, o, u, x oder X
short int
short unsigned int
h d, i, o, u, x oder X
__int32
unsigned __int32
I32 d, i, o, u, x oder X
__int64
unsigned __int64
I64 d, i, o, u, x oder X
intmax_t
uintmax_t
j oder I64 d, i, o, u, x oder X
long double l (Kleinbuchstaben L) oder L a, A, e, E, f, F, g oder G
long int
long unsigned int
l (L als Kleinbuchstaben) d, i, o, u, x oder X
long long int
unsigned long long int
ll (Kleinbuchstaben LL) d, i, o, u, x oder X
ptrdiff_t t oder I (Großbuchstabe i) d, i, o, u, x oder X
size_t z oder I (Großbuchstabe i) d, i, o, u, x oder X
Einzelbytezeichen h c oder C
Breitzeichen l (Kleinbuchstaben L) oder w c oder C
Einzelbytezeichenfolge h s, Soder Z
Breitzeichenfolge l (Kleinbuchstaben L) oder w s, Soder Z

Die Typen ptrdiff_t und size_t sind __int32 oder unsigned __int32 auf 32-Bit-Plattformen und __int64 oder unsigned __int64 auf 64-Bit-Plattformen. Die I Größenpräfixe (Großbuchstaben i), j, tund z nehmen die richtige Argumentbreite für die Plattform an.

Obwohl long double in Visual C++ ein gesonderter Typ ist, hat er die gleiche interne Darstellung wie double.

Ein hc Typspezifizierer oder hC ist synonym mit c in printf Funktionen und mit C in wprintf Funktionen. Ein lc- , lC- wcoder wC -Typbezeichner ist synonym mit C in printf Funktionen und mit c in wprintf Funktionen. Ein hs Typspezifizierer oder hS ist synonym mit s in printf Funktionen und mit S in wprintf Funktionen. Ein lsTypbezeichner , lS, wsoder wS ist synonym mit S in printf Funktionen und mit s in wprintf Funktionen.

Hinweis

Microsoft-spezifisch:
Die I Präfixe für die Argumentgröße (Großbuchstaben i), I32, I64und w sind Microsoft-Erweiterungen und nicht ISO C-kompatibel. Das h Präfix, wenn es mit Daten vom Typ char verwendet wird, und das l Präfix (Kleinbuchstaben L), wenn es mit Daten vom Typ double verwendet wird, sind Microsoft-Erweiterungen.

Siehe auch

printf, _printf_l, wprintf, _wprintf_l
printf_s, _printf_s_l, wprintf_s, _wprintf_s_l
printf_p Positionsparameter