Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
C von A bis Z von Jürgen Wolf
Das umfassende Handbuch für Linux, Unix und Windows
– 2., aktualisierte und erweiterte Auflage 2006
Buch: C von A bis Z

C von A bis Z
1.116 S., mit CD, Referenzkarte, 39,90 Euro
Galileo Computing
ISBN 3-89842-643-2
gp Kapitel 7 Elementare Datentypen
  gp 7.1 Der Datentyp int (Integer)
  gp 7.2 Variablen deklarieren
    gp 7.2.1 Erlaubte Bezeichner
  gp 7.3 C versus C++ bei der Deklaration von Variablen
  gp 7.4 Der Datentyp long
  gp 7.5 Der Datentyp short
  gp 7.6 Die Gleitpunkttypen float und double
    gp 7.6.1 Gleitpunkttypen im Detail
    gp 7.6.2 float im Detail
    gp 7.6.3 double im Detail
    gp 7.6.4 long double
    gp 7.6.5 Einiges zu n-stelliger Genauigkeit
  gp 7.7 Numerische Gleitpunktprobleme
  gp 7.8 Der Datentyp char
  gp 7.9 Nationale contra internationale Zeichensätze
  gp 7.10 Vorzeichenlos und vorzeichenbehaftet
  gp 7.11 Limits für Ganzzahl- und Gleitpunktdatentypen
  gp 7.12 Konstanten
    gp 7.12.1 Ganzzahlkonstanten
    gp 7.12.2 Gleitpunktkonstanten
    gp 7.12.3 Zeichenkonstanten
    gp 7.12.4 String-Literale (Stringkonstante)
  gp 7.13 Umwandlungsvorgaben für formatierte Ein–/Ausgabe


Galileo Computing - Zum Seitenanfang

7.13 Umwandlungsvorgaben für formatierte Ein–/Ausgabtoptop

Sie haben oben für Datentypen auch die Umwandlungsvorgaben, also Formatzeichen, kennen gelernt. 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:

gp  F = [Formatierungszeichen]
gp  W = [Weite]
gp  G = [Genauigkeit]
gp  L = [Längenangabe]
gp  U = [Umwandlungszeichen]

Die Formatierungszeichen sind die Zeichen eines bestimmten Typs, die Sie ausgeben können. Hier ist die Liste. Einige wurden bereits verwendet:


Tabelle 7.11   Typenbezeichner von Umwandlungszeichen

Formatierungszeichen Es wird ausgegeben (eine) …
%d, %i ... vorzeichenbehaftete ganze Dezimalzahl.
%o ... vorzeichenlose ganze Oktalzahl.
%u ... vorzeichenlose ganze Dezimalzahl.
%x, %X ... vorzeichenlose ganze Hexzahl (a,b,c,d,e,f) bei x; (A,B,C,D,E,F) bei X
%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.
%g, %G ... float ohne Ausgabe der nachfolgenden Nullen
%c ... Form von einem Zeichen (unsigned char)
%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:


Tabelle 7.12   Suchmengenkonvertierung mit scanf()

Umwandlungszeichen Es wird eingelesen ...
%[bezeichner] … bis ein Zeichen eingegeben wurde, welches 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 (s = String, Zeichenkette) ersetzt werden. Dabei wird die Menge von Zeichen eingeschlossen, welche 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
Hier klicken, um das Bild zu Vergrößern

Abbildung 7.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 später beim Thema Strings.

Ist das erste Zeichen der Suchmenge ein Caret (^), wird die Suchmenge invertiert, sodass alle ASCII-Zeichen zulässig sind, außer denen, welche in den Klammern angegeben sind. Auch hierzu ein Beispiel:

/* suchmenge2.c */
#include <stdio.h>
int main(void) {
   char str[20];
   printf("Eingabe machen (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 Grossbuchstaben von A bis Z
%[a-z]    //alle Kleinbuchstaben von a bis z
//Alle Gross- Kleinbuchstaben von A bis F (Hexadezimalzahlen)
%[a-fA-F]

Wenn Sie wie in diesen Beispielen den Bindestrich verwenden, müssen Sie folgende Regeln beachten:

gp  Das Zeichen vor dem Bindestrich muss lexikalisch vor dem darauf folgenden Zeichen liegen. Es ist also nicht möglich, [C-A] anzugeben.
gp  Der Bindestrich darf nicht das letzte oder erste Zeichen sein. (Ausgenommen, es wird nach dem ASCII-Zeichen des Bindestrichs gesucht.)

Weiter mit den Formatierungszeichen, welche ausschließlich für die formatierte Ausgabe, wie mit printf(), fprintf(), sprintf() und vprintf(), gedacht sind. Folgende Flags stehen dafür zur Verfügung:


Tabelle 7.13   Flags für die Formatanweisung

Flag Bedeutung
- Links bü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 wird 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 die Ausgabe der Weite. Folgende zwei Angaben lassen sich dazu verwenden:


Tabelle 7.14   Formatangaben zur Ausgabe der Weite

Angaben Bedeutung
n Es werden mindestens n Stellen ausgegeben, auch wenn der Wert weniger als n Stellen besitzt.
* 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 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.

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« ausgegeben als »3.14«. 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
Hier klicken, um das Bild zu Vergrößern

Abbildung 7.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:


Tabelle 7.15   Argumenttyp-Modifikationen

Modifikation Auswirkung
h Die Umwandlungszeichen d, i, o, u, x, X werden als short-Wert behandelt.
l Die Umwandlungszeichen d, i, o, u, x, X werden als long- und double-Wert behandelt.
L Die Umwandlungszeichen e, E, f, g, G werden als long double-Wert behandelt.

 << zurück
  
  Zum Katalog
Zum Katalog: C von A bis Z
C von A bis Z
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Shell-Programmierung






 Shell-Programmierung


Zum Katalog: Linux-UNIX-Programmierung






 Linux-UNIX-Programmierung


Zum Katalog: C/C++






 C/C++


Zum Katalog: UML 2.0






 UML 2.0


Zum Katalog: Reguläre Ausdrücke






 Reguläre Ausdrücke


Zum Katalog: Linux






 Linux


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Galileo Press 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de