| Mit den Standard-Funktionen printf() und sprintf() kann man vielfältig formatierte Texte aus konstanten und variablen Bestandteilen herstellen und/oder ausgeben. | Auf dieser Seite werden ausgewählte Details und Beispiele für fortgeschrittene C/C++ AnwenderInnen vorgestellt. |
C/C++
|
Klassiker der modernen Programmiersprachen |
| printf() und sprintf() | Die Syntax der beiden Ausgabe-Funktionen |
| Format-String | Das obligatorische 'Programm' zur Formatierung der Ausgabe |
Codierung von Sonderzeichen in String-Konstanten |
|
| Platzhalter | 'Programm' zur Ausgabe eines Variablen-Wertes |
Optionaler Teil eines Platzhalters |
|
Optionaler Teil eines Platzhalters |
|
|
Optionaler Teil eines Platzhalters zur Angabe der Nachkomma-Stellen
|
|
|
Ganze oder Gleitkomma-Zahl, Zeichen, String, ...
|
|
| Einfache Ausgabe | Alternative Version dieser Seite für wenig geübte EntwicklerInnen |
| Verwandte Themen: | Funktionen printf() und sprintf() in Perl und PHP, Funktionen pack() und unpack() in Perl und PHP, Codierung von Zeichen, ASCII, ISO-8859, Unicode, UTF-8, ANSI-Escape-Sequenzen |
Die Funktionen printf(), sprintf(), fprintf() |
|
|
Die Funktionen printf(), sprintf()
und fprintf() sind eng miteinander verwandt
und werden daher gemeinsam vorgestellt. Alle modernen Programmiersprachen (z.B. → Perl, → PHP) bieten diese Funktionen, allerdings in etwas abweichenden Varianten. |
Alle genannten Funktionen sind in der Standard-Bibliothek
<stdio.h> enthalten und dienen der Erzeugung bzw. Ausgabe von
Strings (Text) aus fixen und variablen Bestandteilen. Die gleichen Formatierungs-Regeln werden auch von den Funktionen scanf() und sscanf() verwendet. |
Funktion printf()Diese Funktion leitet den erzeugten String direkt an den Standard Ausgabe-Kanal [stdout], d.h. in den meisten Fällen zur Anzeige an das Konsolen-Fenster. |
Funktion sprintf()Diese Funktion übergibt den erzeugten String zur weiteren Bearbeitung an eine String-Variable (Array bzw. Pointer vom Typ char). |
Syntax von printf()int printf (const char *format [, Variablen-Liste]);
Rückgabe (optional, ganze Zahl)
•
Bei Erfolg die Anzahl >=0 der ausgegebenen Zeichen (String-Länge),• bei Misserfolg eine negative ganze Zahl <0 In der Praxis wird die Rückgabe meistens ignoriert.
1. Argument format (Format-String-Konstante)
Ein obligatorischer String zur Beschreibung des Ausgabe-Formats in einer Art
Mini-Programm.Die komplexen Regeln werden in den weiteren ↓ Kapiteln vorgestellt. 2.... Argumente (Variablen-Liste)
Optionale Liste von Variablen, deren aktuelle Werte im Ausgabe-String
erscheinen sollen. Die einzelnen Variablen werden
durch , Beistrich getrennt.• Die Liste muss genauso viele Variable enthalten, wie Platzhalter im Format-String enthalten sind. |
Syntax von sprintf()
int sprintf (char *str, const char *format [,Variablen-Liste]);
Rückgabe (optional, ganze Zahl)
•
Bei Erfolg die Anzahl >=0 der ausgegebenen Zeichen (String-Länge),
und zwar ohne das abschließende 0-Byte,• bei Misserfolg eine negative ganze Zahl <0
1. Argument str (Rückgabe-String)
Pointer auf ein Array von Typ char, welches groß
genug ist, um den erzeugten String + 1 Null-Byte aufzunehmen.
2. Argument format (Format-String-Konstante)
Ein obligatorischer String zur Beschreibung des Ausgabe-Formats in
einer Art Mini-Programm.Die komplexen ↓ Regeln sind identiasch mit jenen für die Funktion printf() 3.... Argumente (Variablen-Liste)
Optionale Liste von Variablen, deren aktuelle Werte im Ausgabe-String
erscheinen sollen. Die einzelnen Variablen werden
durch , Beistrich getrennt.• Die Liste muss genauso viele Variable enthalten, wie Platzhalter im Format-String enthalten sind. |
Variablen-ListeDie nach dem Format-String erwartete Liste der Variablen muss normale Variable enthalten, d.h. Pointer sind nicht zulässig. |
Ausnahmen stellen die beiden ↓ Typen %s (String) und %p (Pointer) dar, bei denen nur Pointer erlaubt sind. Die Type %n (Zeichen-Anzahl) braucht keine Variable. |
|
Beispiel:
#include <stdio.h>
#include <string.h> int main() {
int i,*pi;
}
double x; char c,str[20]; printf("String-Konstante\n"); i = 123; printf("i = %d (decimal)\n",i); printf("i = 0%o (octal)\n",i); printf("i = 0x%X (hexadecimal)\n",i); x = 5000.0 / 3.0; printf("x = %G (var)\n",x); printf("x = %f (float)\n",x); printf("x = %E (sci)\n",x); c = 65; printf("Code(%c) = %d\n",c,c); strcpy(str,"ABC"); printf("str = %s\n",str); pi = &i; printf("pi = %p\n",pi);
String-Konstante
i = 123 (decimal) i = 0173 (octal) i = 0x7B (hexadecimal) x = 1666.67 (var) x = 1666.666667 (float) x = 1.666667E+003 (sci) Code(A) = 65 str = ABC pi = 012369CF |
Beispiel:
#include <stdio.h>
#include <string.h> int main() {
int i;
}
double x; char c,s1[31],s2[31],s3[255]; strcpy(s3,"String-Konstante\n"); i = 234; sprintf(s1,"i=%d\n",i); strcat(s3,s1); x = 5.0 / 3.0; sprintf(s1,"x=%f\n",x); strcat(s3,s1); c = 90; sprintf(s1,"Zeichen(%d) = %c\n",c); strcat(s3,s1); strcpy(s2,"XYZ"); sprintf(s1,"s2 = %s\n",s2); strcat(s3,s1); printf("%s",s3);
String-Konstante
i = 234 x = 1.666667 Zeichen(90) = Z s2 = XYZ Die Teile (Zeilen) des Test-Strings werden in s1, s2 erzeugt, in s3 gesammelt und zuletzt ausgegeben. |
|
•
Hinweis zu den Beispielen: Die beiden Funktionen strcpy() und strcat() sind in der Standard C-Bibliothek <string.h> enthalten. |
•
Funktion strcpy() fügt das 2. Argument
als 0-terminierten String in die als 1. Argument bezeichnete
String-Variable ein. • Funktion strcat() verkettet die beiden als Argumente bezeichneten Strings und fügt sie als 0-terminierten String in das 1. Argument ein. |
Funktion fprintf()Diese Funktion dient zur Ausgabe an Dateien. Sie erhält als zusätzliches Argument das FileHandle (hier fp) und arbeitet ansonsten gleich wie printf() |
Beispiel:
FILE *fp;
char path[]="/srv/www/htdocs/c_to_web_2.html"; fp = fopen(path,"w"); fprintf(fp,"Ausgabe an Datei %s\n",path); fclose(fp); |
Format-String |
|
|
Jede Funktion printf()
oder sprintf() muss einen Format-String als
Konstante (!) enthalten. Die Verwendung einer String-Variablen wird zwar durch manche Compiler gestattet, ist aber unverlässlich und nicht empfehlenswert. |
Darin sind wie in einem Mini-Programm alle Angaben enthalten, nach denen der erzeugte Ausgabe-String formatiert werden soll. |
Fixer Text (String-Konstante)Im einfachsten Fall enthält der Format-String lediglich einen fixen Text als Konstante.Meistens wird der String mit der ↓ Escape-Folge \n (NewLine, neue Zeile) abgeschlossen. |
Beispiel:
printf("Titelzeile\n");
Ausgabe:
Titelzeile
|
Platzhalter• Ein ↓ Platzhalter ist eine besondere Zeichen-Folge, die im Format-String enthalten sein kann. Er wird bei der Verarbeitung zur Gänze durch den aktuellen Wert einer Variablen ersetzt.• Ein Format-String kann fixe Text-Bestandteile und Platzhalter in beliebiger Reihenfolge enthalten. • Ein Format-String kann beliebig viele verschiedene Platzhalter enthalten. Die nachfolgende Variablen-Liste muss allerdings genau so viele Variable anführen, wie Platzhalter im Format-String enthalten sind. |
• Der Aufbau eines ↓ Platzhalter-Strings folgt strengen Regeln, die in den weiteren ↓ Kapiteln dieser Seite vorgestellt werden. • Jeder Platzhalter beginnt mit einem % Prozent-Zeichen. Beispiel:
double x = 5.0/3.0;
Ausgabe:
printf("x = %f\n",x); x = 1.666667
|
Escape-Sequenzensind besondere Zeichen-Folgen, die in jeder String-Konstante enthalten sein können. |
Beispiel: Die ↓ Escape-Sequenz \n wird verwendet, um eine Zeile abzuschließen. |
Escape-Sequenzen |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Allgemeine RegelAlle druckbaren Zeichen innerhalb einer String-Konstanten stehen prinzipiell 'für sich selbst', d.h. sie erscheinen in der Ausgabe genauso wie im Quelltext (Programm-Text des C/C++ Programms). |
Von dieser Regel gibt es einige allgemeine Ausnahmen und 1 zusätzliche Ausnahme nur für Format-Strings. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Druckbare ASCII-ZeichenDie druckbaren → ASCII-Zeichen mit den Code-Nummern 32...126 (0x20...0x7E) kann man normalerweise in jederr String-Konstante direkt verwenden.• Für die Ausgabe (Erzeugung) von → HTML Webseiten oder → XML-Dokumenten muss man einige Zeichen zusätzlich maskieren, z.B. < " & > als < " & > |
Nicht druckbare ASCII Steuerzeichen1..31 und 127 (0x1...0x1F, 0x7F) werden von jedem C/C++ Programm zwar ausgegeben, jedoch nur dann angezeigt, wenn der Ausgabe-Kanal dazu in der Lage ist.• Ein 0-Byte kann in einem String nicht enthalten sein und muss bei Bedarf als einzelnes Zeichen [%c] ausgegeben werden. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Non-ASCII 1-Byte-Zeichenmit Code-Nummern 128...255 (0x80...0xFF) werden von einem C/C++ Programm zwar genauso behandelt wie → ASCII-Zeichen, jedoch je nach dem vom Ausgabe-Medium verwendeten → Zeichensatz unterschiedlich angezeigt.♣ Vermeinden sie nach Möglichkeit die Ausgabe solcher Zeichen, insbesondere der deutschen Sonderzeichen
Ä Ö Ü ä ö ü ß €
Diese Zeichen sollten im Quelltext eines C/C++ Programms keinesfalls
vorkommen, nicht einmal in einem Kommentar !● Diese Zeichen werden am besten als → XML-Entity oder in einer der → UTF-Codierungen (hier in UTF-8) Byte-weise ausgegeben. Beispiel:
printf("Ä Ö Ü");
Ausgabe:
printf("\xC3\xA4 \xC3\xB6 \xC3\xBC \xC3\x9F");
Ä Ö Ü
ä ö ü ß |
Unicode-Zeichenmit Code-Nummern >255 (>U+00FF) erfordern besondere Maßnahmen. Die Programmiersprache C/C++ ist in der Grundversion nicht für MultiByte-Zeichen ausgerüstet.● Es ist jedoch kein Problem, beliebige → Unicode-Zeichen als → XML-Entity oder in einer der → UTF-Codierungen (hier in UTF-8) Byte-weise auszugeben. Beispiel:
printf("euro = €");
Ausgabe:
printf("euro = \xE2\x82\xAC");
euro = €
euro = € |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SteuerzeichenDie beiden Zeichen " DoubleQuote und \ BackSlash haben innerhalb jeder C/C++ String-Konstanten eine besondere Bedeutung als Operatoren: Sie erscheinen nicht wie alle anderen 'druckbaren Zeichen' in der Ausgabe:• Das Zeichen " DoubleQuote bezeichnet Anfang und Ende eines Strings und kann daher innerhalb eines Strings nicht verwendet werden. • Das Zeichen \ BackSlash wird als Maskierungs-Operator verwendet. |
• Nur in den beiden Funktionen printf() und sprintf() hat auch das % Prozent-Zeichen eine besondere Funktion als ↓ 'Platzhalter' • Alle 3 Zeichen ("%\) kann man daher innerhalb von Format-Strings nicht so wie jedes andere druckbare Zeichen verwenden. Wenn sie in der Ausgabe enthalten sein sollen, dann muss man sie durch 'Maskierung' besonders kennzeichnen. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Maskierung► Das \ Backslash-Zeichen dient innerhalb aller String-Konstanten als Operator, der selbst nicht ausgegeben wird.Das unmittelbar nachfolgende Zeichen wird in diesem Fall anders behandelt. Man unterscheidet 2 Fälle: • Die Kombinationen \" und \\ heben die Operator-Bedeutung der beiden Zeichen " und \ auf. Man verwendet sie, um diese beiden Zeichen als solche auszugeben. Beispiel:
printf("Das ist ein \\
\"Backslash\"\n");
erzeugt die Ausgabe
Das ist ein \ "BackSlash"
|
• Einige Kombinationen haben eine besondere Bedeutung zur Ausgabe von 'nicht druckbaren Steuerzeichen', z.B.: \n ... Neue Zeile (wichtig, oft verwendet) • Nur in den Format-Strings der Funktionen printf() und sprintf() wird ein % Zeichen mit einem weiteren maskiert. Beispiel:
printf("Das ist ein %% Prozent-Zeichen\n");
erzeugt die Ausgabe
Das ist ein % Prozent-Zeichen
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Liste ausgewählter Escape-Sequenzen
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SteuerzeichenViele der oben vorgestellten Escape-Sequenzen geben Zeichen aus, deren Wirkung je nach Medium unbestimmt ist:• \a \b \f \r \v werden nicht von jedem Ausgabe-Medium angezeigt bzw. ausgeführt. • Ein Tabulator \t wird zwar meistens 'verwendet', die dabei zurückgelegte Schrittweite ist jedoch vom Medium bzw. vom verwendeten System und Programm abhängig und daher unverlässlich. • Die meist-verwendete Escape-Sequenz \n (NewLine) dient als Abschluss einer Ausgabe-Zeile. Normalerweise wird zusätzlich ein implizites \r (Return) Zeichen ausgegeben, d.h. die nächste Zeile beginnt ungefragt am linken Rand. |
Beliebige ZeichenIm Prinzip hebt ein vorangestellter \ BackSlash die Operator-Bedeutung jedes einzelnen nachfolgenden Zeichens auf. Ein überschüssiger BackSlash hat daher normalerweise keine Wirkung.Beispiel: Das ? Fragezeichen wird in den meisten Anwendungen als Zeichen direkt ausgegeben, in einigen speziellen Fällen jedoch als Operator verwendet. Mit einem vorangestellten \? Backslash wird es auf jeden Fall als ? Zeichen ausgegeben. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Hexadezimal-CodeMit der Sequenz \0x** kann man jedes beliebige Byte bezeichnen. Für druckbare → ASCII-Zeichen (Code 32...126) ist das jedoch nicht notwendig, und für Code>127 problematisch.● Ein Byte >127 wird zwar ausgegeben, jedoch je nach System, Programm und dem von ihm verwendeten → Zeichensatz unterschiedlich angezeigt. Beispiel: Deutsche Umlaute ÄÖÜ (nur) für die Windows-Konsole:
printf("\x8E\x99\x9A");
// printf("ÄÖÜ");
// funktioniert nicht !
● Man kann diese Codierung verwenden, um beliebige Bytes auszugeben, z.B. um → UTF-8 Code zu erzeugen. Beispiel: Deutsche Umlaute ÄÖÜ als UTF-8 Code: printf("\xC3\x84\xC3\x96\xC3\x9C");
|
XMLDie einzige sichere und weltweit eindeutige Methode zur Angabe von → Unicode-Zeichen mit Code >U+007F ist die Ausgabe von → XML-Text und Angabe der betreffenden Zeichen als XML-Entity oder in → UTF-Codierung (meist als UTF-8).♦ C/C++ Funktionen zur UTF-8 Codierung und Decodierung von beliebigen Unicode-Zeichen. Beispiel: Das € Euro-Zeichen (Unicode U+20AC) wird im XML-Text als Entity € angegeben. Diese Maskierung verwendet ausschließlich ASCII-Zeichen und wird von jedem Programm auf weltweit jedem IT-System eindeutig interpretiert, z.B. auch von jedem Browser. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ANSI Escape-SequenzenDie US-Behörde zur Verwaltung von Standards ANSI hat einige spezielle Zeichen-Kombinationen standardisiert.Mit ihrer Hilfe kann man auch in einem Konsolen-Fenster einfache grafische Effekte nutzen, z.B. Text- und Hintergrund-Farben, Cursor-Bewegung usw. |
Die ANSI Escape-Sequenzen spielten in der IT-Urzeit eine wichtige Rolle und werden noch heute von fast allen Konsolen-Programmen (mit Ausnahme von Windows cmd.exe) verstanden. ♦ Details zu ausgewählten ANSI Escape-Sequenzen und zur Programmierung von Text-Farben in Konsolen-Programmen. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Platzhalter |
||||||||||||||||
|
Ein Platzhalter ist ein nach strengen Regeln aufgebauter Teil eines
↑
Format-Strings, welcher die gewünschte Formatierung einer
Variablen angibt. Der Platzhalter wird bei der Ausgabe zur Gänze durch den aktuellen Wert der Variablen ersetzt. |
●
Ein Platzhalter muss mindestens ein führendes
% Zeichen und die Typ-Angabe enthalten. ● Weitere 3 Elemente können optional enthalten sein, die Reihenfolge ist jedoch streng einzuhalten. |
|||||||||||||||
|
||||||||||||||||
| Die einzelnen Bestandteile eines Platzhalters erlauben umfangreiche Möglichkeiten zur detaillierten Gestaltung der Ausgabe. Sie werden deshalb in eigenen Kapiteln dieser Seite vorgestellt: |
↓ Flags ↓ Feld-Breite ↓ Genauigkeit ↓ Variablen-Typ |
|||||||||||||||
Flags (optional) |
|||||||||||||||||||||||||||||||
|
Ein Platzhalter-Flag ist ein optionales Element in einem
↑ Platzhalter-String. Ein Flag ist ein einzelnes Zeichen. Man kann mehrere Flags kombinieren, wenn das sinnvoll ist. |
Die folgende Tabelle gibt die Wirkung der Flags verglichen mit dem Standard-Verhalten (ohne Flag) an. | ||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||
|
Beispiele
int i,j;
Ausgabe:
i=123; j=-234; printf("i=%d j=%d\n",i,j); printf("i=%5d j=%5d\n",i,j); printf("i=%-5d j=%-5d\n",i,j); printf("i=%+5d j=%+5d\n",i,j); printf("i=%05d j=%05d\n",i,j); printf("i=%02d j=%02d\n",i,j); i=123 j=-234 i= 123 j= -234 i=123 j=-234 i= +123 j= -234 i=00123 j=-0234 i=123 j=-234 |
Beispiele
double x;
Ausgabe (das @ Zeichen dient zur sichtbaren Markierung der
↓ Feldbreite):
x=1.0; printf("x=%f @\n",x); printf("x=%5f @\n",x); printf("x=%10f @\n",x); printf("x=%-10f @\n",x); printf("x=%+10f @\n",x); printf("x=%010f @\n",x); printf("x=%9.2E @\n",x); x=1.000000 @ x=1.000000 @ x= 1.000000 @ x=1.000000 @ x= +1.000000 @ x=001.000000 @ x=1.00E+000 @ |
||||||||||||||||||||||||||||||
Feld-Breite (optional) |
|
|
Die Feld-Breite ist ein optionales Element in einem
↑
Platzhalter-String. Sie wird als ganze Zahl angegeben. • Wenn der erzeugte Ausgabe-Text kleiner als die Feldbreite ist, dann wird er rechtsbündig dargestellt und links mit Leerzeichen aufgefüllt. |
•
Wenn das Flag 0 angegeben wurde,
dann wird mit 0 Zeichen an Stelle der
Leerzeichen aufgefüllt. • Das Flag - bewirkt die linksbündige Darstellung des Feldes. • Wenn der Ausgabe-Text größer als die Feldbreite ist, dann wird er nicht abgeschnitten. Der erzeugte Text ignoriert in diesem Fall die Vorgabe der Feldbreite. |
|
Beispiele
int i,j;
i=123; j=-234; printf("i=%d j=%d @\n",i,j); printf("i=%2d j=%2d @\n",i,j); printf("i=%5d j=%5d @\n",i,j); printf("i=%-5d j=%-5d @\n",i,j); |
Ausgabe: (Das @ Zeichen dient zur Kennzeichnung der FeldBreite) i=123 j=-234 @ i=123 j=-234 @ i= 123 j= -234 @ i=123 j=-234 @ |
Gleitkomma-FeldbreiteGeben sie für Gleitkomma-Zahlen im Format [%f] mindestens eine FeldBreite von (Dezimalstellen + 3) an: Vorzeichen, Einer-Stelle und Dezimalpunkt.Beispiel
double x;
Ausgabe:
x = -2.0/3.0; printf("x = %6.3f\n",x); x = -0.667
|
♣
Geben sie für Gleitkomma-Zahlen im Format [%e]
oder [%E] mindestens eine FeldBreite von
(Dezimalstellen
+ 7) an: Vorzeichen, Dezimalpunkt und Einerstelle der Mantisse,
Zeichen e oder E,
Vorzeichen des Exponenten.
Beispiel
double x;
Ausgabe:
x = -2.0/3.0; printf("x = %11.3E\n",x); x = -6.667E-001
|
Genauigkeit, Dezimalstellen (optional) |
|
|
Die Genauigkeit ist ein optionales Element in einem
↑
Platzhalter-String. • Sie wird normalerweise nur für Gleitkomma-Argumente angegeben und bezeichnet mit einer ganzen Zahl die Anzahl darzustellender Nachkomma-Stellen. • Die Angabe der Dezimalstellen wird mit einem . Punkt eingeleitet. |
RundungDie letzte ausgegebene Dezimalstelle wird nach den üblichen Regeln gerundet.Beispiel
double x;
Ausgabe:
x = 5.0/3.0; printf("x = %f\n",x); printf("x = %6.3f\n",x); printf("x = %.f\n",x); printf("x = %11.3E\n",x);
x = 1.666667
x = 1.667 x = 2 x = 1.667E+000 |
Ausgabe-FormatIn der Ausgabe erscheint ebenfalls ein Komma-Punkt, so wie international üblich. Lediglich im deutschen Sprachraum wird ein Dezimal-Beistrich verwendet, und Punkte zur Trennung von (Tausender) Ziffern-Gruppen. Das ist aufwändig, teuer und Anlass für Missverständnisse.♣ Tipp: Formatieren sie die Ausgabe von Gleitkomma-Zahlen unmissverständlich. |
Wählen sie die Feld-Breite ausreichend groß: Für den ↓ Typ [%f] mindestens mit (Dezimalstellen + 3) für Vorzeichen, dezimale Einer-Stelle und Dezimalpunkt. Bei 'wissenschaftlicher' Darstellung [%e %E] sollte die Feld-Breite (Dezimalstellen + 7) betragen. Für die ↓ Typen [%g %G] wird damit die Anzahl signifikanter Ziffern angegeben. |
StandardOhne Angabe der Genauigkeit werden Gleitkomma-Zahlen meist mit 6 Nachkomma-Stellen ausgegeben. Das ist allerdings von den Umständen abhängig und daher nicht verlässlich ! |
Wenn man einen . Punkt ohne nachfolgende Angabe der Genauigkeit verwendet, dann wird der Wert .0 angenommen: Die Gleitkomma-Zahl wird in diesem Fall auf ganze Zahlen gerundet angezeigt, d.h. ohne Dezimalstellen. |
|
Sonderfälle
Man kann das Genauigkeits-Element auch für ganze Zahlen
mit ↓
Typen [%d, %i, %o, %u, %x, %X] angeben.Man bezeichnet damit in diesem Fall die gesamte Anzahl auszugebender Stellen. ♣ Tipp: Verwenden sie dazu besser die Angabe der ↑ FeldBreite. Wenn der Ausgabe-Text kürzer ist, wird er links mit 0 Zeichen aufgefüllt. Wenn der Ausgabe-Text länger ist, dann wird er nicht abgeschnitten, sondern die Angabe der Genauigkeit ignoriert. Bei Angabe von Genauigkeit=0 unterbleibt die Auffüllung mit 0 Zeichen. |
Die Angabe der 'Genauigkeit' wird für den ↓ Typ [%c] (Character) ignoriert. Für den ↓ Typ [%s] (String) wird damit die maximale Anzahl auszugebender Zeichen begrenzt. Ohne Angabe der 'Genauigkeit' wird ein String in seiner gesamten Länge bis zum ersten 0-Byte ausgegeben. |
Wenig erfahrere EntwicklerInnen neigen dazu, die Rundung in Ausgabe-Funktionen mit der
Rundung der Werte von Gleitkomma-Zahlen zu verwechseln. Die beiden Begriffe sind voneinander
unabhängig !
|
Der Wert einer Gleitkomma-Variablen bleibt gleich, wenn man ihn in der
Ausgabe gerundet angibt.
♦ Details zum
Runden und
Abschneiden von Gleitkomma-Zahlen
|
Variablen-Typ |
||||||||||||||||||||||||||||||||||||||||||||||
Der Typ ist ein unbedingt erforderliches Element in einem
↑
Platzhalter-String.
|
||||||||||||||||||||||||||||||||||||||||||||||
Längen-PrefixEs ist möglich, die Typ-Bezeichnung durch ein vorangestelltes Prefix zu modifizieren:
|
Diese Prefix-Zeichen funktionieren nicht mit allen Compilern. Testen sie die Funktion im Zweifel, oder versuchen sie, ohne das Prefix auszukommen. |
|||||||||||||||||||||||||||||||||||||||||||||
Hexadezimale %x %X ZahlenDie Typen [%o, %x, %X] sind nur auf ganze Zahlen anwendbar. Zur Ausgabe von binären Zahlen oder anderen Zahlen-Systemen werden keine Typ-Bezeichner angeboten. Man muss diese Formate bei Bedarf durch eigene Funktionen erzeugen.• Hexadezimale Zahlen werden meist mit dem Prefix 0x oder # ausgegeben. Man setzt es in den Format-String unmittelbar vor dem %-Zeichen ein. • Hex-Zahlen werden am besten in fixer Länge von 2, 4 oder 8 Ziffern mit führenden Nullen angegeben. Das entspricht den Format-Strings 0x%02X oder 0x%04X oder 0x%08X • Negative Zahlen werden intern im → 2er-Komplement dargestellt und dazu auf die volle 'Wort-Breite' expandiert. Durch → AND-Verknüpfung mit einem BitMuster (hier mit 0xFF) kann man die Anzahl der ausgegebenen Bits (Hex-Ziffern) begrenzen. |
Beispiele:
int i,j;
Typische Ausgabe:
i = 31; printf("i = %d = 0x%X\n",i,i); printf("i = 0x%04X\n",i); j = -1; printf("j = %d = 0x%X\n",j,j); j &= 0xFF; printf("j = %d = 0x%X\n",j,j);
i = 31 = 0x1F
i = 0x001F j = -1 = 0xFFFFFFFF j = 255 = 0xFF |
|||||||||||||||||||||||||||||||||||||||||||||
Octale %o ZahlenDer Typ [%o] ist nur auf ganze Zahlen anwendbar.• Octale Zahlen werden meist mit dem Prefix 0 ausgegeben. Man setzt es in den Format-String unmittelbar vor dem %-Zeichen ein. • Vorsicht: Dieses Formatierung ist leicht mit einer DezimalZahl mit führender 0 zu verwechseln, z.B. bei Angabe von Datum oder Uhrzeit ! |
Beispiel:
int i=127;
Ausgabe:
printf("i = %d = 0x%X = 0%o \n",i,i,i);
i = 127 = 0x1F = 0177
|
|||||||||||||||||||||||||||||||||||||||||||||
Pointer %pDie Formatierung des Typs [%p] (Pointer) ist einfach: Die Ausgabe erfolgt als positive ganze Hexadezimal-Zahlen. Es gibt weder Vorzeichen noch Nachkomma-Stellen.Dieser Typ wird während der Entwicklung zum Debuggen verwendet. ♣ Die absolute Lage der Adressen im Speicher wird normalerweise nicht vom Programm sondern vom Betriebssystem (zur Laufzeit) bestimmt und ist daher variabel. |
Beispiel: Adressen der
Variablen i und j
int i,j;
Ausgabe:
printf("&i=%p\n",&i); printf("&j=%p\n",&j);
&i=0022FF40
&j=0022FF44 |
|||||||||||||||||||||||||||||||||||||||||||||
Zeichen-Anzahl %nDieser Typ verlangt keine Variable, sondern wird durch die gesamte Anzahl der von der Funktion printf() erzeugten Zeichen-Bytes ersetzt. |
► Vorsicht: Dieser Typ funktioniert nicht mit jedem Compiler ! Verwenden sie besser die Funktion strlen() der Bibliothek <string.h> |
|||||||||||||||||||||||||||||||||||||||||||||