5.20 Umwandlungsvorgaben für formatierte Ein-/Ausgabe 

Sie haben oben für Datentypen auch die Umwandlungsvorgaben, also Formatzeichen kennengelernt. Es lässt sich damit aber noch eine Menge mehr anstellen. Die Formatierungszeichen (oder auch Formatierungsanweisung genannt) beginnen immer – wie schon bei scanf() und printf() – mit dem Zeichen % und beziehen sich dann auch auf das oder die nachfolgenden Argumente. Mit
scanf("%d",&a);
wird beispielsweise auf die Eingabe eines Integerwerts gewartet. Dies erkennen Sie am Formatierungszeichen %d. Folglich wird durch
%c
ein char-Zeichen anhand der ASCII-Code-Tabelle in einen Buchstaben umgewandelt (genauer kodiert). Aber außer den bereits erwähnten Umwandlungszeichen können noch weitere Umwandlungsvorgaben festgelegt werden.
Bei der formatierten Ausgabe mit Funktionen, wie z. B. printf(), fprintf(), vprintf()und sprintf(), haben Sie noch folgende Möglichkeiten:
% F W G L U
Die Bedeutung der einzelnen Buchstaben ist:
- F = [Formatierungszeichen]
- W = [Weite]
- G = [Genauigkeit]
- L = [Längenangabe]
- U = [Umwandlungszeichen]
Die Formatierungszeichen sind die Zeichen eines bestimmten Typs, die Sie ausgeben können. In Tabelle 5.14 sehen Sie die Liste. Einige wurden bereits verwendet:
Formatierungszeichen | Ausgegeben wird (eine) |
%d, %i |
vorzeichenbehaftete ganze Dezimalzahl |
%lld, %lli |
vorzeichenbehaftete ganze Dezimalzahl (long long) |
%o |
vorzeichenlose ganze Oktalzahl |
%u |
vorzeichenlose ganze Dezimalzahl |
%llu |
vorzeichenlose ganze Dezimalzahl (unsigned long long) |
%x, %X |
vorzeichenlose ganze Hexzahl (a,b,c,d,e,f) bei x; (A,B,C,D,E,F) bei X |
%llx, %llX |
vorzeichenlose ganze Hexzahl (a,b,c,d,e,f) bei x; (A,B,C,D,E,F) bei X (unsigend long long) |
%f |
Gleitpunktzahl in Form von ddd.dddddd |
%e, %E |
Gleitpunktzahl in Form von d.ddde+-dd bzw. d.dddE+-dd. Der Exponent enthält mindestens 2 Ziffern. |
%a |
wie %f (neu ab C99) |
%g, %G |
float ohne Ausgabe der nachfolgenden Nullen |
%c |
Form von einem Zeichen (unsigned char) |
%lc |
Form von einem breiten Zeichen (wchar_t) |
%s |
Form einer Zeichenkette |
%p |
Ausgabe eines Zeigerwertes |
%n |
Keine Ausgabe. Dieses Argument ist ein Zeiger auf eine Ganzzahl. |
%% |
das Zeichen % |
Beim Einlesen eines Zeichens, eines numerischen Werts oder einer Zeichenkette gelten bei der formatierten Eingabe mit Funktionen wie etwa scanf(), sscanf(), fscanf() dieselben Umwandlungszeichen wie bei printf(). Hierbei können Sie aber auch noch eine Suchmengenkonvertierung verwenden:
Umwandlungszeichen | Es wird eingelesen, |
%[bezeichner] |
bis ein Zeichen eingegeben wurde, das nicht in der Liste bezeichner vorkommt. |
%[^bezeichner] |
bis ein Zeichen eingegeben wurde, das in der Liste bezeichner vorkommt. |
Diese Suchmengenkonvertierung kann durch Zeichen des Formatierungstyps s (String, Zeichenkette) ersetzt werden. Dabei wird die Menge von Zeichen eingeschlossen, die sich zwischen den Klammern befindet. Beispiel:
/* suchmenge1.c */ #include <stdio.h> int main(void) { char str[20]; printf("Bitte geben Sie nur Zahlen ein: "); scanf("%[0-9]", str); printf("%s\n",str); return 0; }
Abbildung 5.11 Suchmengenkonvertierung mit »scanf()«
In diesem Beispiel werden Sie aufgefordert, nur Zahlen einzugeben. scanf() liest so lange Zahlen ein, bis das erste Zeichen nicht zwischen 0 bis 9 ist. Beachten Sie bitte, dass es sich hierbei um keine reellen Zahlen handelt, sondern um einen String. Wünschen Sie eine reelle Zahl, müssen Sie den String mit einer entsprechenden Funktion konvertieren. Mehr dazu folgt später beim Thema Strings (siehe Abschnitt 11.13).
Ist das erste Zeichen der Suchmenge ein Caret (^), wird die Suchmenge invertiert, sodass alle ASCII-Zeichen zulässig sind, außer denen, die in den Klammern angegeben sind. Auch hierzu ein Beispiel:
/* suchmenge2.c */ #include <stdio.h> int main(void) { char str[20]; printf("Eingabe (keine Buchstaben wie x,y und z): "); scanf("%19[^xyz]", str); printf("%s\n",str); return 0; }
Hierbei liest scanf() so lange ein, bis es auf das Zeichen 'x', 'y' oder 'z' trifft. Zusätzlich wurde hier festgelegt, dass scanf() nach mehr als 19 Zeichen ebenfalls abbricht (aus Sicherheitsgründen sollten Sie scanf() in der Praxis immer mit einer Längenangabe verwenden). Weitere Beispiele:
%[A-Z] //alle Großbuchstaben von A bis Z %[a-z] //alle Kleinbuchstaben von a bis z //Alle Groß- und Kleinbuchstaben von A bis F (Hexadezimalzahlen) %[a-fA-F]
Wenn Sie wie in diesen Beispielen den Bindestrich verwenden, müssen Sie folgende Regeln beachten:
- Das Zeichen vor dem Bindestrich muss lexikalisch vor dem darauf folgenden Zeichen liegen. Es ist also nicht möglich, [C-A] anzugeben.
- Der Bindestrich darf nicht das letzte oder erste Zeichen sein (es sei denn, es wird nach dem ASCII-Zeichen des Bindestrichs gesucht).
Formatierungszeichen sind ausschließlich für die formatierte Ausgabe gedacht, wie mit printf(), fprintf(), sprintf() und vprintf(). Folgende Flags stehen dafür zur Verfügung:
Flag | Bedeutung |
- |
Linksbündig justieren |
+ |
Ausgabe des Vorzeichens '+' oder '-' |
Leerzeichen |
Ist ein Argument kein Vorzeichen, wird ein Leerzeichen mit ausgegeben. |
0 |
Bei numerischer Ausgabe wird mit Nullen bis zur angegebenen Weite aufgefüllt. |
# |
Bei o bzw. x oder X (bspw. %#X) wird der Wert im Formatstring mit vorangestellter 0 bzw. 0x ausgegeben. Bei e, E oder f wird der Wert mit einem Dezimalpunkt ausgegeben, auch wenn keine Nachkommastelle existiert. |
Die Flags müssen nach dem %-Zeichen stehen, und falls es sinnvoll ist, können mehrere Flags gleichzeitig verwendet werden.
Als Nächstes betrachten wir die Ausgabe der Weite. Folgende zwei Angaben lassen sich dazu verwenden:
Angaben | Bedeutung |
n |
Es werden mindestens n Stellen ausgegeben, auch wenn der Wert weniger als n Stellen besitzt. |
* |
Der Wert des nächsten Arguments (ganzzahlig) legt die Weite fest. Bei negativem Wert wird linksbündig justiert. |
Folgendes Programm soll die Ausgabe der Weite demonstrieren:
/* weite.c */ #include <stdio.h> int main(void) { int i=10; printf("%5d\n",i); printf("%*d\n",i,i); return 0; }
Falls Sie eine nicht vorhandene oder zu kleine Weitenangabe vornehmen, bewirkt dies nicht, dass die Zahlen beschnitten werden bzw. mehr Zeichen enthalten. Beispiel:
printf("%2d\n",100); // Ausgabe: 100 printf("%4d\n",100); // Ausgabe: 100
In beiden Fällen wird die Zahl 100 ausgegeben, egal, welche Längenangabe getroffen wird. Beim formatierten Einlesen gilt Folgendes als Weitenangabe:
scanf("%2d\n",&zahl);
Falls Sie jetzt nach dieser scanf()-Eingabe-Aufforderung mehr als zwei Ziffern eingeben, z. B. 100, so wird in diesem Fall die letzte 0 nicht mit eingelesen, und der Wert der Variable zahl ist 10.
Kommen wir jetzt zur Genauigkeitsangabe der formatierten Ausgabe. Der genauen Schreibweise geht ein Punkt voran:
printf("%.2f\n",3.143234); // Ausgabe 3.14
Hiermit wird die Gleitpunktzahl »3.143234« als »3.14« ausgegeben. Das heißt aber nicht, dass sich der Wert der Zahl verändert hat, sondern dies bezieht sich nur auf die formatierte Ausgabe. Die Zahl wird also nicht auf- oder abgerundet. So bewirkt z. B. die Ausgabe von
printf("%.2d\n",1000); // Ausgabe 1000
nicht, dass 10 ausgegeben wird. In diesem Fall wird dennoch die Zahl 1000 ausgegeben. Hingegen wird bei Strings dieser Bereich wiederum beschnitten. Zur Verdeutlichung ein weiteres Beispiel:
/* formatieren .c */ #include <stdio.h> int main (void) { char text[]="Tiefstand"; printf("|01234567890123456789|\n"); printf("|%s|\n",text); printf("|%20s|\n",text); printf("|%-20s|\n",text); printf("|%20s|\n",text+4); printf("|%20.4s|\n",text); printf("|%-20.4s|\n",text); printf("|%-20s|\n",text+4); return 0; }
Abbildung 5.12 Formatierte Ausgabe mit Angabe der Weite
Zum Schluss sind jetzt noch die einzelnen Längenangaben und ihre jeweiligen Auswirkungen vorzustellen. Im Fachjargon spricht man auch von einer Argumenttyp-Modifikation.
Modifikation | Auswirkung |
h |
Die Umwandlungszeichen d, i, o, u, x, X werden als short int-bzw. unsigned short int-Wert behandelt. |
l |
Die Umwandlungszeichen d, i, o, u, x, X werden als long int- bzw. unsigned long int-Wert behandelt. Wird hingegen e, f oder g verwendet, werden die Umwandlungszeichen als double-Wert behandelt. |
L |
Die Umwandlungszeichen e, E, f, g, G werden als long double-Wert behandelt. Die Umwandlungszeichen d, i, o, u, x, X hingegen werden als long long-Wert behandelt. |
hh |
Wie h, nur dass die Umwandlungszeichen d, i, o, u, x, X als signed char- bzw. unsigned char-Wert behandelt werden. |
j |
Die Umwandlungszeichen d, i, o, u, x, X werden als intmax_t- bzw. uintmax_t-Wert behandelt (neu ab C99). |
t |
Die Umwandlungszeichen d, i, o, u, x, X werden als ptrdiff_t-Wert behandelt (neu ab C99). |
z |
Die Umwandlungszeichen d, i, o, u, x, X werden als size_t-Wert behandelt (neu ab C99). |
Hierzu ein einfaches Listing, das einige dieser Argumenttyp-Modifikationen in der Praxis demonstrieren soll:
/* typmodifikation.c */ #include <stdio.h> int main (void) { short sval; double dval; long long llval; signed char cval; printf("Ein short-Wert : "); scanf("%hd", &sval); printf("Ein double-Wert : "); scanf("%lf", &dval); printf("Ein long long-Wert : "); scanf("%Ld", &llval); printf("Ein char-Wert : "); scanf("%hhd", &cval); printf("Der short-Wert ist %hd\n", sval); printf("Der double-Wert ist %lf\n", dval); printf("Der long long-Wert ist %Ld\n", llval); printf("Der char-Wert ist %hhd\n", cval); return 0; }
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.