![]() Vorherige Seite |
![]() Eine Ebene hoch |
![]() Nächste Seite |
---|
Die Funktion printf dient der Ausgabe von Informationen auf dem Bildschirm. Neben einfachen Textzeilen können alle elementaren Datentypen der Sprache C formatiert ausgegeben werden.
Die Funktion printf erwartet einen oder mehrere Parameter. Der erste, obligatorische Parameter ist eine Zeichenkette, der die Ausgabe formatiert. Die nachfolgenden optionalen Parameter beinhalten die Daten, die dargestellt werden sollen:
printf(Formatstring, ...);
Der Formatstring kann eine Konstante oder eine Variable sein. Er beinhaltet normalen Text, mit einigen Platzhaltern für die Daten, die ausgegeben werden sollen. Ein Platzhalter wird mit einem Prozentzeichen '%' eingeleitet und endet mit einem Buchstaben, der den Datentyp repräsentiert.
Beispiel: Die Variable v steht für die Geschwindigkeit eines Autos und ist vom Typ double. Die Ausgabe der Geschwindigkeit erfolgt mit folgender Anweisung:
double v=57.3; printf("Geschwindigkeit: %f km/h\n", v);
Der Platzhalter für die Variable v wird hinter dem Wort Geschwindigkeit: mit dem Prozentzeichen eingeleitet. Der Buchstabe f steht für den Datentyp double.
Die Funktion printf kann auch mit nur einen Parameter zur reinen Textausgabe verwendet werden. Die Anweisung
printf("hello world\n");
gibt den Text hello world auf den Bildschirm aus.
Der Platzhalter kann neben den Buchstaben für den Datentyp Angaben zur Formatierung des Datums enthalten. Allgemein hat ein Platzhalter folgendes Aussehen:
%[Flags][Breite][.Pr�zision][h|l|L]Typ
In den folgenden Tabellen werden die einzelnen Teile der Platzhalter aufgelistet.
Platzhalter | Datentyp | Darstellung |
---|---|---|
%d oder %i | signed int | dezimal |
%u | unsigned int | dezimal |
%o | unsigned int | oktal |
%x | unsigned int | sedezimal (mit kleinen Buchstaben) |
%X | unsigned int | sedezimal (mit großen Buchstaben) |
%f | double | immer ohne Exponent |
%e | double | immer mit Exponent (durch 'e' angedeutet) |
%E | double | immer mit Exponent (durch 'E' angedeutet) |
%g | double | nach Bedarf mit Exponent (durch 'e' angedeutet) |
%G | double | nach Bedarf mit Exponent (durch 'E' angedeutet) |
%c | char | einzelnes Zeichen |
%s | char[] | Zeichenkette (String) |
%p | void * | Speicheradresse |
%n | signed int * | schreibt die Anzahl der bisherigen Zeichen in die angeg. Adresse |
%% | - | Ausgabe des Zeichens '%' |
Modifizierer | angewendet auf | Interpretation/Wirkung |
---|---|---|
h | d, i, o, u, x, X | short int |
n | short int* | |
l | d, i, o, u, x, X | long int |
n | long int* | |
e, E, f, g, G | double (nur scanf) | |
L | e, E, f, g, G | long double |
Breite | Wirkung |
---|---|
n | min. n Zeichen, Leerzeichen vorangestellt |
0n | min. n Zeichen, Nullen vorangestellt |
* | das nächste Argument aus der Liste ist die Breite |
Präzision | angewendet auf Typ | Präzision |
---|---|---|
.n | e, E, f | n Nachkommastellen |
g, G | max. n Nachkommastellen | |
.0 | e, E, f | kein Dezimalpunkt |
<nix> | e, E, f | 6 Nachkommastellen |
.* | Präzision aus nächstem Argument der Liste |
Flags | angewendet auf Typ | Bedeutung |
---|---|---|
<Keins> | rechtsbündig | |
- | linksbündig mit folgenden Leerzeichen | |
+ | Vorzeichen immer ausgeben (auch +) | |
<Leerzeichen/gt; | nur negative Vorzeichen | |
# | o | für Werte != 0 wird eine '0' vorgestellt |
x, X | für Werte != 0 wird '0x', bzw. '0X' vorgestellt | |
e, E, f, g, G | Dezimalpunkt immer ausgeben |
Hier ein paar Beispiele:
printf-Anweisung | Ausgabeergebnis |
---|---|
float v=87.3; | Speed: 87.300000 |
printf("Das kostet %.2f DM\n", 15.9); | Das kostet 15.90 DM |
char Name[]="Meier"; | Guten Tag |
int Zahl=12; | 12345678 |
printf("%.2e\n", 124.8); | 1.25e+002 |
printf("%#.0f\n", 12.3); | 12. |
double Zahl=12.3456; | 12345678 |
Wenn für die darzustellenden Daten falsche Platzhalter verwendet werden, kann es zu Problemen kommen. Betrachten Sie folgendes Programmstück:
double d=5.2; int i=3; printf("%d %d\n", d, i);
Beim Aufruf der Funktion printf werden alle Parameter der Reihe nach in den Speicher kopiert. In unserem Beispiel sieht das so aus:
Abbildung A2-1: Anordnung der Aufrufparameter im Speicher.
Der Platzhalter %d wird fälschlicherweise auf die Variable d vom Typ double angewendet. Das heißt, die Variable d wird hier als int interpretiert. Die Programmierumgebung, in der das Programm getestet wurde, verwendet für double 8 Byte und für int nur 4 Byte. Der Befehl printf nimmt daher von der Variable d nur die ersten vier Byte und interpretiert sie als int.
Der nächste Platzhalter steht wieder für den Typ int. Da aber der vorherige Platzhalter die Variable vom Typ double nur zur Hälfte eingelesen hat, versucht jetzt der zweite Platzhalter die zweite Hälfte der Variable d als int zu interpretieren. Es ist offensichtlich, das dabei Unsinn heraus kommt. In der Testumgebung sah das so aus:
-858993459 1075104972
Lange Rede, kurzer Sinn: Es ist peinlichst darauf zu achten, dass die Platzhalter mit den dazugehörigen Datentypen zusammenpassen.