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:
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 Flags, Breite 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 Parameterüberprüfung.
Wichtig
Stellen Sie für Sicherheit und Stabilität 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. Gehen Sie zum Drucken user_name
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
die Familie der Funktionen als inline
und in die <stdio.h>
Kopfzeilen deklariert 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 nach dem entsprechenden Typzeichen und dem optionalen Größenpräfix interpretiert. Konvertierungen für Zeichentypen char
und wchar_t
werden mithilfe c
oder C
, und Single-Byte- und Multibyte- oder Breitzeichenzeichenfolgen mithilfe s
oder S
, je nachdem, welche Formatierungsfunktion verwendet wird, angegeben. Zeichen- und Zeichenfolgenargumente, die mithilfe von c
Familienfunktionen oder familienspezifischen wprintf
wchar_t
wchar_t*
Funktionen angegeben und s
interpretiert char
char*
printf
werden. Zeichen- und Zeichenfolgenargumente, die mithilfe von C
Familienfunktionen oder familienspezifischen wprintf
char
char*
Funktionen angegeben und S
interpretiert wchar_t
wchar_t*
printf
werden. Dieses Verhalten ist microsoftspezifisch. Aus historischen Gründen verwenden s
c
und verweisen die wprintf
Funktionen auf wchar_t
Zeichen, und C
S
geben Sie schmale Zeichen an.
Ganzzahlige Typen wie short
, int
, , long
, long long
und deren unsigned
Varianten werden mithilfe d
von , , i
, o
, u
, , x
und .X
Gleitkommatypen wie , und , werden mithilfe a
von , A
, , e
, E
f
, F
, , , und g
.G
long double
double
float
Standardmäßig werden ganzzahlige Argumente durch ein Größenpräfix geändert, und Gleitkommaargumente werden in die Eingabe umgewandelt int
, und Gleitkommaargumente werden in double
" umgewandelt. Bei 64-Bit-Systemen handelt es int
sich um einen 32-Bit-Wert. Daher werden 64-Bit-Ganzzahlen abgeschnitten, wenn sie für die Ausgabe formatiert werden, es sei denn, ein Größenpräfix von ll
oder I64
wird verwendet. Zeigertypen, die mithilfe p
der Standardzeigergröße für die Plattform angegeben werden.
Hinweis
Microsoft-spezifisch:
Das Z
Typzeichen und das Verhalten der c
Zeichen , C
, s
und S
Typzeichen, wenn sie mit den printf
Und-Funktionen wprintf
verwendet werden, sind Microsoft-Erweiterungen. Der ISO C-Standard verwendet c
und s
konsistent für schmale Zeichen und Zeichenfolgen sowie S
C
für breite Zeichen 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 |
Ganzzahl | Ganze Dezimalzahl mit Vorzeichen |
i |
Ganzzahl | Ganze Dezimalzahl mit Vorzeichen |
o |
Ganzzahl | Oktale ganze Zahl ohne Vorzeichen |
u |
Ganzzahl | Ganze Dezimalzahl ohne Vorzeichen |
x |
Ganzzahl | Nicht signierte hexadezimale ganze Zahl; verwendet "abcdef ". |
X |
Ganzzahl | Nicht signierte hexadezimale ganze Zahl; verwendet "ABCDEF ". |
e |
Gleitkomma | Signierter Wert mit dem Format [- ]d.dddde []ddd[+ - |d], wobei d eine Dezimalziffer ist, ddd ist je nach der angegebenen Genauigkeit eine oder mehrere Dezimalstellen, und dd[d] ist je nach Ausgabeformat und Größe des Exponenten zwei oder drei Dezimalstellen. |
E |
Gleitkomma | Identisch mit dem e Format, mit dem Ausnahme, dass E der Exponent nicht e eingeführt wird. |
f |
Gleitkomma | Signierter Wert mit dem Format [- ]dddd ddd. , wobei dddd mindestens eine Dezimalziffer 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 ist. |
g |
Gleitkomma | Signierte Werte werden in f oder e im Format angezeigt, je nachdem, welcher Wert für den angegebenen Wert und die Genauigkeit kompakter ist. Das e Format wird nur verwendet, wenn der Exponent des Werts kleiner als -4 oder größer als 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 g Format, es sei denn, es E wird e der Exponent (sofern zutreffend) eingeführt. |
a |
Gleitkomma | Signierter hexadezimaler Gleitkommawert mit doppelter Genauigkeit, der die Form [- ]0x h.hhhhp [|+ - ]dd aufweist, wobei h.hhhhh die Hexadezimalstellen (mit Kleinbuchstaben) der Mantissa und dd eine oder mehrere Ziffern für den Exponenten sind. Die Genauigkeit gibt die Anzahl der Ziffern nach dem Punkt an. |
A |
Gleitkomma | Signierter hexadezimaler Gleitkommawert mit doppelter Genauigkeit, der die Form [- ]0X h.hhhhP [|+ - ]dd hat, wobei h.hhhhh die Hexadezimalstellen (mit Großbuchstaben) der Mantissa 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 hexadezimalen Ziffern 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 , w um ein UNICODE_STRING Argument anzugeben, %wZ z. 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 in der UCRT, das zurzeit aus Kompatibilitätsgründen beibehalten wird. Wie der Bezeichner bezieht sich der S Z Bezeichner ohne Größenmodifiziererpräfix auf ein UNICODE_STRING , wenn eine schmale Druckfunktion (z. B. ) printf und eine ANSI_STRING breite Druckfunktion verwendet wird (z wprintf . B. ).Verwenden Sie anstelle von Z , um eine ANSI_STRING .hZ wZ (oder lZ ) kann weiterhin verwendet werden, um eine UNICODE_STRING . In der Regel wird das Z Typzeichen nur in Treiberdebuggingfunktionen verwendet, die eine Konvertierungsspezifikation verwenden, z dbgPrint . B. und kdPrint . |
In Visual Studio 2015 und höheren Versionen entspricht das Argument, das einem Gleitkommakonvertierungsbezeichner (a
, A
, , , E
e
, f
F
, , , g
) G
entspricht, der formatierten Ausgabe dem C99-Standard. In dieser Tabelle ist die formatierte Ausgabe aufgeführt:
Wert | Output |
---|---|
Unendlichkeit | inf |
Stiller NaN | nan |
Signalisierender NaN | nan(snan) |
Unbestimmter NaN | nan(ind) |
Eine dieser Zeichenfolgen kann einem Zeichen 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 |
---|---|
+ Infinity | 1.#INF Zufällige Ziffern |
-Unendlichkeit | -1.#INF Zufällige Ziffern |
unbestimmt (mit stillem NaN identisch) | Zufällige .#IND Ziffern |
NaN | Zufällige .#NAN Ziffern |
Möglicherweise wurde einer dieser Zeichenfolgen ein Zeichen vorangestellt und je nach Feldbreite und Genauigkeit, manchmal mit ungewöhnlichen Effekten, anders formatiert. Beispielsweise wird gedruckt1.#J
, printf("%.2f\n", INFINITY)
da die #INF auf zwei Ziffern gerundet werden würde.
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 Ziffern festlegen, die aus Gründen der Abwärtskompatibilität mit Code angezeigt werden, der für Visual Studio 2013 und vorher geschrieben wurde.
Wichtig
Da das %n
Format inhärent unsicher ist, ist es standardmäßig deaktiviert. Wenn %n
in einer Formatzeichenfolge aufgetreten ist, wird der ungültige Parameterhandler aufgerufen, wie in der Parameterüberprüfung beschrieben. Informationen zum Aktivieren des %n
Supports 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 Kennzeichenzeichen, die die Ausgabe von Zeichen, Leerzeichen, führende Nullen, Dezimalzeichen und oktale und hexadezimale Präfixe angeben. 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 setzen, wenn es sich um einen signierten Typ handelt. | Das Vorzeichen taucht nur für negative Werte mit Vorzeichen (-) auf. |
0 |
Wenn der Breite ein Präfix vorangestellt 0 ist, werden führende Nullen hinzugefügt, bis die Mindestbreite erreicht ist. Wenn beides 0 angezeigt - wird, wird dies 0 ignoriert. Wenn 0 für ein ganzzahliges Format (i , , u , X x , o , d ) angegeben ist und eine Genauigkeitsspezifikation ( z. B. ) ebenfalls vorhanden ist, %04.d wird dies 0 ignoriert. Wenn 0 für das Gleitkommaformat oder A das a Gleitkommaformat angegeben wird, werden führende Nullen der Mantissa nach dem 0x Präfix oder 0X präfix vorangestellt. |
Keine Auffüllung. |
Leerzeichen („ “) | 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 o x , oder X format verwendet wird, verwendet 0 das # Flag einen 0x wert ungleichen Ausgabewert bzw0X . präfixieren. |
Es wird kein Präfix angezeigt. |
Wenn sie mit dem e Attribut , E , f , F , , a oder A format verwendet wird, erzwingt das # Flag den Ausgabewert, um einen Dezimalkommapunkt zu enthalten. |
Dezimaltrennzeichen werden nur dann angezeigt, wenn Ziffern darauf folgen. | |
Wenn sie mit dem g Format verwendet G wird, erzwingt das # Flag, dass der Ausgabewert einen Dezimalkommapunkt enthält und verhindert, dass nachfolgende Nullen abgeschnitten werden.Wird ignoriert, wenn sie mit c , d , , i , u oder s . |
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 minimale Anzahl von Zeichen steuert, die ausgegeben werden. 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
das Präfix 0 ist, werden führende Nullen zu ganzzahligen oder Gleitkommakonvertierungen hinzugefügt, bis die Mindestbreite erreicht ist, außer wenn die Konvertierung in eine Unendlichkeit oder NaN
eine Unendlichkeit erfolgt.
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 ausgegeben, vorbehaltlich der Genauigkeitsspezifikation.
Wenn die Genauigkeitsangabe ein Sternchen (*
) ist, stellt ein int
-Argument aus der Argumentliste den Wert bereit. Das width
Argument muss dem Wert vorangehen, der in der Argumentliste formatiert ist, 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 breiter 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. Es besteht aus einem Punkt (.
) gefolgt von einer nicht negativen Dezimalzahl, die abhängig vom Konvertierungstyp die Anzahl der Zeichenfolgenzeichen, die Anzahl der Dezimalstellen oder die Anzahl der zu ausgebenden signifikanten Ziffern angibt.
Im Gegensatz zu den Breitenangabe kann die Genauigkeitsangabe den Ausgabewert abschneiden oder auf einen Gleitkommawert aufrunden. Wenn precision
als 0 angegeben wird und der zu konvertierende Wert 0 ist, gibt das Ergebnis keine Zeichenausgabe aus, 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 oder precision
die Standardgenauigkeit, wenn precision
sie weggelassen wird, wie in der folgenden Tabelle dargestellt.
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 oder der Punkt (. ) ohne Eine Zahl angezeigt wird, wird kein Dezimalkomma gedruckt. |
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 wenn der Punkt (. ) ohne Eine Zahl angezeigt wird, nach der sie folgt, wird kein Dezimalkomma 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 Nullzeichen gefunden wird. |
Angabe der Argumentgröße
In einer Konvertierungsangabe ist das size-Feld ein Argumentlängenmodifizierer für den Konvertierungsspezifizierertyp. Das Größenfeldpräfix für das Typfeld –hh
, h
, , j
, ( l
Kleinbuchstabe L), L
, , w
ll
z
t
( I
Großbuchstaben i) I32
und I64
– geben Sie je nach dem Konvertierungsbezeichner, den sie ändernden Konvertierungsbezeichner an, lange oder kurz, 32-Bit- oder 64-Bit-, Einzelbyte-Zeichen oder breite Zeichen. 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 Argumentüberaufsufung finden Sie unter "Ellipsis" und "Standardargumente" in Postfix-Ausdrücken. Auf 32-Bit- und 64-Bit-Systemen muss die Konvertierungsspezifikation eines 64-Bit-Ganzzahlarguments ein Größenpräfix von ll
oder I64
enthalten. 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 variabler Breite explizit auf 64 Bit hoch. Der Microsoft-spezifische I
(Großbuchstabe i)-Argumentgrößenmodifizierer behandelt ganzzahlige Argumente mit variabler Breite, aber wir empfehlen die typspezifischen j
, t
und z
Modifizierer für die Portabilität.
Größenpräfixe für printf- und wprintf-Formattypbezeichner
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 (Kleinbuchstabe 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 , S oder Z |
Breitzeichenfolge | l (Kleinbuchstaben L) oder w |
s , S oder 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
Präfixe (Großbuchstaben i), j
, t
und z
Größe verwenden die richtige Argumentbreite für die Plattform.
Obwohl long double
in Visual C++ ein gesonderter Typ ist, hat er die gleiche interne Darstellung wie double
.
Ein hc
Bezeichner oder hC
Typbezeichner ist gleichbedeutend mit c
printf
Funktionen und C
in wprintf
Funktionen. A lc
, lC
, , wc
oder wC
Typbezeichner ist synonym mit C
Funktionen printf
und in c
wprintf
Funktionen. Ein hs
Bezeichner oder hS
Typbezeichner ist gleichbedeutend mit s
printf
Funktionen und S
in wprintf
Funktionen. Ein ls
, lS
, , ws
oder wS
Typbezeichner ist synonym mit S
printf
Funktionen und in s
wprintf
Funktionen.
Hinweis
Microsoft-spezifisch:
Die I
Präfixe (Großbuchstaben i) I32
I64
und w
Argumentgrößenmodifiziererpräfixe sind Microsoft-Erweiterungen und sind nicht ISO C-kompatibel. Das h
Präfix, wenn es mit Daten vom Typ char
und dem l
Präfix (Kleinbuchstaben L) verwendet wird, wenn es mit Datentypen 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