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

Inhaltsverzeichnis
Vorwort
Vorwort des Gutachters
1 Einstieg in C
2 Das erste Programm
3 Grundlagen
4 Formatierte Ein-/Ausgabe mit »scanf()« und »printf()«
5 Basisdatentypen
6 Operatoren
7 Typumwandlung
8 Kontrollstrukturen
9 Funktionen
10 Präprozessor-Direktiven
11 Arrays
12 Zeiger (Pointer)
13 Kommandozeilenargumente
14 Dynamische Speicherverwaltung
15 Strukturen
16 Ein-/Ausgabe-Funktionen
17 Attribute von Dateien und das Arbeiten mit Verzeichnissen (nicht ANSI C)
18 Arbeiten mit variabel langen Argumentlisten – <stdarg.h>
19 Zeitroutinen
20 Weitere Headerdateien und ihre Funktionen (ANSI C)
21 Dynamische Datenstrukturen
22 Algorithmen
23 CGI mit C
24 MySQL und C
25 Netzwerkprogrammierung und Cross–Plattform-Entwicklung
26 Paralleles Rechnen
27 Sicheres Programmieren
28 Wie geht’s jetzt weiter?
A Operatoren
B Die C-Standard-Bibliothek
Stichwort

Download:
- ZIP, ca. 10,6 MB
Buch bestellen
Ihre Meinung?

Spacer
<< zurück
C von A bis Z von Jürgen Wolf
Das umfassende Handbuch
Buch: C von A bis Z

C von A bis Z
3., aktualisierte und erweiterte Auflage, geb., mit CD und Referenzkarte
1.190 S., 39,90 Euro
Galileo Computing
ISBN 978-3-8362-1411-7
Pfeil 5 Basisdatentypen
Pfeil 5.1 Deklaration und Definition
Pfeil 5.2 Der Datentyp »int« (Integer)
Pfeil 5.3 Variablen verwenden
Pfeil 5.4 Der Datentyp »long«
Pfeil 5.5 Der Datentyp »long long«
Pfeil 5.6 Der Datentyp »short«
Pfeil 5.7 Ganzzahlige Typen mit vorgegebener Breite – <stdint.h>
Pfeil 5.7.1 <inttypes.h> (C99)
Pfeil 5.8 Die Gleitpunkttypen »float« und »double«
Pfeil 5.8.1 Gleitpunkttypen im Detail
Pfeil 5.8.2 »float« im Detail
Pfeil 5.8.3 »double« im Detail
Pfeil 5.8.4 long double
Pfeil 5.8.5 Einiges zu n-stelliger Genauigkeit
Pfeil 5.9 Numerische Gleitpunktprobleme
Pfeil 5.10 Komplexe Gleitpunkttypen – <complex.h>
Pfeil 5.11 Der Datentyp »char«
Pfeil 5.12 Nationale contra internationale Zeichensätze
Pfeil 5.13 Der Breitzeichen-Typ »wchar_t«
Pfeil 5.14 Multibyte-Zeichen
Pfeil 5.15 Boolescher Wert – <stdbool.h>
Pfeil 5.16 Vorzeichenlos und vorzeichenbehaftet
Pfeil 5.17 Limits für Ganzzahl- und Gleitpunktdatentypen
Pfeil 5.18 Der Typ »void«
Pfeil 5.19 Konstanten
Pfeil 5.19.1 Ganzzahlkonstanten
Pfeil 5.19.2 Gleitpunktkonstanten
Pfeil 5.19.3 Zeichenkonstanten
Pfeil 5.19.4 Stringliterale (Stringkonstante)
Pfeil 5.20 Umwandlungsvorgaben für formatierte Ein-/Ausgabe


Galileo Computing - Zum Seitenanfang

5.20 Umwandlungsvorgaben für formatierte Ein-/Ausgabe topZur vorigen Überschrift

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:


Tabelle 5.14 Typenbezeichner von Umwandlungszeichen

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:


Tabelle 5.15 Suchmengenkonvertierung mit »scanf()«

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:


Tabelle 5.16 Flags für die Formatanweisung

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:


Tabelle 5.17 Formatangaben zur Ausgabe der Weite

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.


Tabelle 5.18 Argumenttyp-Modifikationen

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



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.






<< zurück
  
  Zum Katalog
Zum Katalog: C von A bis Z

 C von A bis Z
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Einstieg in C++






 Einstieg in C++


Zum Katalog: C++ von A bis Z






 C++ von A bis Z


Zum Katalog: C/C++






 C/C++


Zum Katalog: Shell-Programmierung






 Shell-Programmierung


Zum Katalog: Linux-UNIX-Programmierung






 Linux-UNIX-
 Programmierung


Zum Katalog: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


Zum Katalog: Ubuntu GNU/Linux






 Ubuntu GNU/Linux


Zum Katalog: Coding for Fun







 Coding for Fun 


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Galileo Press 2009
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