Ausgabe mit printf() @ C/C++

Die Standard-Funktionen printf(), sprintf(), fprintf()

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-Liste

Die 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);
}
Typische Ausgabe:
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);
}
Ausgabe:
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;
printf("x = %f\n",x);
Ausgabe:
x = 1.666667

Escape-Sequenzen

sind 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 Regel

Alle 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-Zeichen

Die 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 &lt; &quot; &amp; &gt;

Nicht druckbare ASCII Steuerzeichen

1..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-Zeichen

mit 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("&#xC4; &#xD6; &#xDC;");
printf("\xC3\xA4 \xC3\xB6 \xC3\xBC \xC3\x9F");
Ausgabe:
Ä Ö Ü
ä ö ü ß

Unicode-Zeichen

mit 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 = &#x20AC;");
printf("euro = \xE2\x82\xAC");
Ausgabe:
euro = €
euro = €

Steuerzeichen

Die 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

escCodeNrBedeutung
\a70x07 Audible Alert, Bell, Glocke, Piepser
\b1270x7F Backspace, 1 Schritt rückwarts
\f120x0C FormFeed, Seiten-Umbruch (oft unbestimmt)
\n100x0A Newline, Zeilen-Umbruch (meist implizit zusätzlich \r)
\r130x0D Carriage Return, (zurück) an den Zeilen-Anfang
\t90x09 Horizontal Tab, Tabulator (unbestimmte Schrittweite !)
\v110x0B Vertical Tab (oft unbestimmt)
\"340x22 Double Quote (maskiert, wird als " ausgegeben)
\'390x27 Single Quote
\?630x3F Fragezeichen
\\920x5C BackSlash (maskiert, wird als \ ausgegeben)
\000x00 Null-Byte
\0**0..25500..FF Octal-Code (* steht für Octal-Ziffern 0..7)
\0x**0..25500..FF Hexadezimal-Code (* steht für 0-9, a-f, A-F)

Steuerzeichen

Viele 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 Zeichen

Im 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-Code

Mit 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");

XML

Die 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 &#x20AC; 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-Sequenzen

Die 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.
Das bietet die Möglichkeit, die Ausgabe von Konsolen-Programmen übersichtlicher zu gestalten.

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.
Prozent %FlagsFeld-Breite Punkt . GenauigkeitVariablen-Typ
erforderlich optional optional optional erforderlich
%[+ - 0 #][ganze Zahl] [. ganze Zahl] [c d e E f g G,...]
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.
FlagBeschreibungStandard
- Ausrichtung: links-bündig rechts-bündig
+ Vorzeichen: auch für positive Zahlen >0 nur für negative Zahlen < 0
<blank> Wenn kein Vorzeichen folgt, dann wird ein Leerzeichen eingefügt. kein Leerzeichen
0 Führende 0 Zeichen bis zur angegebenen Feld-Breite führende Leerzeichen
# unterschiedlich, je nach der folgenden Typ-Bezeichnung:
#o Octales Zahlensystem, fügt führendes 0 Zeichen ein
#x
#X
Hexadezimales Zahlensystem, fügt führende Zeichen 0x oder 0X ein
#e
#E
#f
Gleitkomma-Zahlen im dezimalen Zahlensystem.
Dezimalpunkt wird immer angezeigt, auch dann wenn keine Ziffern folgen.
#g
#G
Kompakte Dezimalzahlen. Dezimalpunkt wird immer angezeigt, auch dann wenn keine Ziffern folgen.
Folgende Nullen werden nicht entfernt.
Beispiele
int i,j;
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);
Ausgabe:
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;
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);
Ausgabe (das @ Zeichen dient zur sichtbaren Markierung der ↓ Feldbreite):
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-Feldbreite

Geben sie für Gleitkomma-Zahlen im Format [%f] mindestens eine FeldBreite von (Dezimalstellen + 3) an: Vorzeichen, Einer-Stelle und Dezimalpunkt.
Beispiel
double x;
x = -2.0/3.0;
printf("x = %6.3f\n",x);
Ausgabe:
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;
x = -2.0/3.0;
printf("x = %11.3E\n",x);
Ausgabe:
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.

Rundung

Die letzte ausgegebene Dezimalstelle wird nach den üblichen Regeln gerundet.
Beispiel
double x;
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);
Ausgabe:
x = 1.666667
x = 1.667
x = 2
x =  1.667E+000

Ausgabe-Format

In 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.

Standard

Ohne 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.
TypBeschreibungBeispiel
cCharacter, einzelnes Zeichena
dInteger, ganze Dezimalzahl [mit Vorzeichen] -123
123
e Gleitkomma Dezimalzahl, wissenschaftliches Format [Mantisse und Exponent] 1.234567e+002
EWie e, jedoch mit großem E 1.234567E+002
fGleitkomma Dezimalzahl 123.456789
gVerwendet die kürzere der beiden Typen [e, f] *
GVerwendet die kürzere der beiden Typen [E, f] *
nAnzahl der von dieser Anweisung erzeugten Zeichen *
oGanze Zahl im Octalsystem [mit Vorzeichen] 173
pPointer, Speicher-Adresse 0033:CCFF
sString, Zeichenkette, Array vom Typ [c] abc xyz
uUnsigned, ganze Dezimalzahl ohne Vorzeichen 123
xGanze Zahl im Hexadezimalsystem ohne Vorzeichen 7b
Xwie x, jedoch mit großen Ziffern A..F 7B

Längen-Prefix

Es ist möglich, die Typ-Bezeichnung durch ein vorangestelltes Prefix zu modifizieren:
PrefixBedeutungfür die Typen
hShorti, d, o, u, x, X
lLongi, d, o, u, x, X
LLong doublee, E, f, g, G

Diese Prefix-Zeichen funktionieren nicht mit allen Compilern.
Testen sie die Funktion im Zweifel, oder versuchen sie, ohne das Prefix auszukommen.

Hexadezimale   %x   %X   Zahlen

Die 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;

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);
Typische Ausgabe:
i = 31 = 0x1F
i = 0x001F

j = -1 = 0xFFFFFFFF
j = 255 = 0xFF

Octale   %o   Zahlen

Der 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;
printf("i = %d = 0x%X = 0%o \n",i,i,i);
Ausgabe:
i = 127 = 0x1F = 0177

Pointer   %p

Die Formatierung des Typs [%p] (Pointer) ist einfach: Die Ausgabe erfolgt als positive ganze Hexadezimal-Zahlen. Es gibt weder Vorzeichen noch Nachkomma-Stellen. Die Anzahl und Formatierung der Stellen ist von System und Compiler vorgegeben.
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;
printf("&i=%p\n",&i);
printf("&j=%p\n",&j);
Ausgabe:
&i=0022FF40
&j=0022FF44

Zeichen-Anzahl   %n

Dieser 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>