http://www.pronix.de -> Bücher -> Bücher aus meiner Feder -> C von A bis Z -> Inhaltsverzeichnis

Inhaltsverzeichnis

1 ... Einstieg in C ... 27
1.1 ... Übersicht zu C ... 27
1.2 ... Der ANSI C-Standard ... 28
...1.2.1 ... Der Vorteil des ANSI C-Standards ... 30
1.3 ... Der POSIX-Standard ... 30
1.4 ... Vor- und Nachteile der Programmiersprache C ... 31
1.5 ... C in diesem Buch ... 32
1.6 ... Was benötige ich für C? ... 33
...1.6.1 ... Texteditor ... 33
...1.6.2 ... Compiler ... 33
...1.6.3 ... All-in-one – die Entwicklungsumgebung ... 34
1.7 ... Welcher Compiler und welches Betriebssystem? ... 35

2 ... Das erste Programm ... 37
2.1 ... Der beste Lernerfolg ... 37
2.2 ... »Hallo Welt« in C ... 37
2.3 ... Analyse des Programms ... 39

3 ... Zeichensätze ... 43
3.1 ... Basic-Zeichensatz ... 43
3.2 ... Ausführungszeichensatz (Steuerzeichen) ... 43

4 ... Kommentare in C ... 47
4.1 ... Wann sind Kommentare sinnvoll? ... 47
4.2 ... Welche Kommentar-Schreibweise: // oder /* */ 48

5 ... Formatierte Eingabe mit scanf() ... 51
5.1 ... Der Adressoperator »&« 52
5.2 ... Probleme und deren Behandlung mit scanf() ... 54
...5.2.1 ... Möglichkeit 1 ... 55
...5.2.2 ... Möglichkeit 2 ... 55
...5.2.3 ... Möglichkeit 3 ... 56
5.3 ... Format prüfen ... 57
5.4 ... Zusammenfassung scanf() ... 58

6 ... Formatierte Ausgabe mit printf ... 61

7 ... Elementare Datentypen ... 63
7.1 ... Der Datentyp int (Integer) ... 63
7.2 ... Variablen deklarieren ... 64
...7.2.1 ... Erlaubte Bezeichner ... 67
7.3 ... C versus C++ bei der Deklaration von Variablen ... 68
7.4 ... Der Datentyp long ... 68
7.5 ... Der Datentyp short ... 69
7.6 ... Die Gleitpunkttypen float und double ... 70
...7.6.1 ... Gleitpunkttypen im Detail ... 72
...7.6.2 ... float im Detail ... 72
...7.6.3 ... double im Detail ... 73
...7.6.4 ... long double ... 73
...7.6.5 ... Einiges zu n-stelliger Genauigkeit ... 74
7.7 ... Numerische Gleitpunktprobleme ... 76
7.8 ... Der Datentyp char ... 77
7.9 ... Nationale contra internationale Zeichensätze ... 82
7.10 ... Vorzeichenlos und vorzeichenbehaftet ... 83
7.11 ... Limits für Ganzzahl- und Gleitpunktdatentypen ... 85
7.12 ... Konstanten ... 88
...7.12.1 ... Ganzzahlkonstanten ... 88
...7.12.2 ... Gleitpunktkonstanten ... 89
...7.12.3 ... Zeichenkonstanten ... 89
...7.12.4 ... String-Literale (Stringkonstante) ... 89
7.13 ... Umwandlungsvorgaben für formatierte Ein-/Ausgabe ... 90

8 ... Operatoren ... 97
8.1 ... Exkurs zu Operatoren ... 97
8.2 ... Arithmetische Operatoren ... 98
...8.2.1 ... Dividieren von Ganzzahlen ... 99
8.3 ... Erweiterte Darstellung arithmetischer Operatoren ... 101
8.4 ... Inkrement- und Dekrement-Operatoren ... 102
8.5 ... Bit-Operatoren ... 103
...8.5.1 ... Bitweises UND ... 104
...8.5.2 ... Bitweises ODER ... 106
...8.5.3 ... Bitweise XOR ... 107
...8.5.4 ... Bitweises Komplement ... 108
...8.5.5 ... Linksverschiebung ... 108
...8.5.6 ... Rechtsverschiebung ... 109
...8.5.7 ... Rezept für Fortgeschrittene ... 109
8.6 ... sizeof-Operator ... 111
...8.6.1 ... C versus C++ 113

9 ... Typenumwandlung ... 115

10 ... Kontrollstrukturen ... 117

10.1 ... Verzweigungen mit der if-Bedingung ... 117
...10.1.1 ... Anweisungsblock ... 117
10.2 ... Die Verzweigung mit else if ... 122
10.3 ... Die Verzweigung mit else ... 123
10.4 ... Der !-Operator (logischer Operator) ... 127
10.5 ... Logisches UND (&&) – Logisches ODER (||) ... 129
10.6 ... Bedingungsoperator ?: 132
10.7 ... Fallunterscheidung: die switch-Verzweigung ... 134
...10.7.1 ... default ... 137
10.8 ... Die while-Schleife ... 138
...10.8.1 ... Endlosschleife (while) ... 140
...10.8.2 ... Fehlervermeidung bei while-Schleifen ... 141
10.9 ... Die do while-Schleife ... 142
10.10 ... Die for-Schleife ... 146
...10.10.1 ... Beispiele für eine for-Schleife ... 149
10.11 ... Kontrollierte Sprünge ... 153
...10.11.1 ... continue ... 153
...10.11.2 ... break ... 155
10.12 ... Direkte Sprünge mit goto ... 155
10.13 ... Notationsstil ... 156
...10.13.1 ... K&R-Stil ... 157
...10.13.2 ... Whitesmith-Stil ... 157
...10.13.3 ... Allman-Stil ... 157
...10.13.4 ... GNU EMACS-Stil ... 157
...10.13.5 ... Der Stil des Autors ;) (K&R-like) ... 157

11 ... Funktionen ... 159
11.1 ... Was sind Funktionen? ... 159
11.2 ... Wozu Funktionen? ... 159
11.3 ... Definition von Funktionen ... 159
11.4 ... Funktionsaufruf ... 160
11.5 ... Funktionsdeklaration ... 162
11.6 ... Lokale Variablen ... 163
11.7 ... Globale Variablen ... 166
11.8 ... Statische Variablen ... 167
11.9 ... Schlüsselworte für Variablen – Speicherklassen ... 168
...11.9.1 ... auto ... 169
...11.9.2 ... extern ... 169
...11.9.3 ... register ... 169
...11.9.4 ... static ... 170
11.10 ... Typ-Qualifizierer ... 170
...11.10.1 ... volatile ... 170
...11.10.2 ... const ... 170
11.11 ... Geltungsbereich von Variablen ... 171
11.12 ... Speicherklassen-Spezifizierer für Funktionen ... 172
...11.12.1 ... extern ... 172
...11.12.2 ... static ... 172
...11.12.3 ... volatile ... 173
11.13 ... Datenaustausch zwischen Funktionen ... 173
11.14 ... Wertübergabe an Funktionen (call-by-value) ... 174
11.15 ... Rückgabewert von Funktionen ... 178
11.16 ... Die Hauptfunktion main() ... 179
11.17 ... Rückgabewert beim Beenden eines Programms ... 181
11.18 ... Funktionen der Laufzeitbibliothek ... 182
11.19 ... Getrenntes Compilieren von Quelldateien ... 183
11.20 ... Rekursive Funktionen ... 185
...11.20.1 ... Exkurs: Stack ... 186
...11.20.2 ... Rekursionen und der Stack ... 186
...11.20.3 ... Fakultät ... 191
...11.20.4 ... Fibonacci-Zahlen ... 192
...11.20.5 ... Größter gemeinsamer Teiler (GGT) ... 193

12 ... Präprozessor-Direktiven ... 199
12.1 ... Einkopieren von Dateien mittels #include ... 199
12.2 ... Makros und Konstanten – #define ... 203
...12.2.1 ... Symbolische Konstanten mit #define ... 203
...12.2.2 ... Makros mit #define ... 208
12.3 ... Bedingte Kompilierung ... 211
12.4 ... Vordefinierte Präprozessor-Direktiven (ANSI C) ... 217
12.5 ... Ersetzung eines Makroparameters durch einen String ... 219
12.6 ... #undef – Makronamen wieder aufheben ... 220
12.7 ... Ausgeben von Fehlermeldungen – #error ... 221
12.8 ... #pragma ... 222

13 ... Arrays ... 223
13.1 ... Arrays deklarieren ... 223
13.2 ... Initialisierung und Zugriff auf Arrays ... 224
...13.2.1 ... Gültigkeitsbereich von Arrays ... 229
13.3 ... Arrays vergleichen ... 231
13.4 ... Anzahl der Elemente eines Arrays ermitteln ... 233
13.5 ... Übergabe von Arrays an Funktionen ... 234
13.6 ... Arrays aus Funktionen zurückgeben ... 236
13.7 ... Programmbeispiel zu den Arrays ... 237
13.8 ... Einlesen von Array-Werten ... 241
13.9 ... Mehrdimensionale Arrays ... 242
13.10 ... Mehrdimensionale Arrays initialisieren ... 242
...13.10.1 ... Tic Tac Toe ... 250
...13.10.2 ... Dreidimensionale Arrays ... 255
13.11 ... Übergabe von zwei- bzw. mehrdimensionalen Arrays an Funktionen ... 256
13.12 ... Arrays in Tabellenkalkulation einlesen (*.CSV-Dateien) ... 258
13.13 ... Strings/Zeichenketten (char Array) ... 259
...13.13.1 ... Vom String zur Binärzahl ... 263
13.14 ... Einlesen von Strings ... 266
13.15 ... Standard-Bibliothek ... 268
...13.15.1 ... strcat() – Strings aneinander hängen ... 269
...13.15.2 ... strchr() – ein Zeichen im String suchen ... 270
...13.15.3 ... strcmp() – Strings vergleichen ... 270
...13.15.4 ... strcpy() – einen String kopieren ... 271
...13.15.5 ... strcspn() – einen Teilstring ermitteln ... 272
...13.15.6 ... strlen() – Länge eines Strings ermitteln ... 272
...13.15.7 ... strncat() – String mit n Zeichen aneinander hängen ... 273
...13.15.8 ... strncmp() – n Zeichen von zwei Strings miteinander vergleichen ... 274
...13.15.9 ... strncpy() – String mit n Zeichen kopieren ... 275
...13.15.10 ... strpbrk() – Auftreten bestimmter Zeichen suchen ... 276
...13.15.11 ... strrchr() – das letzte Auftreten eines bestimmten Zeichens im String suchen ... 276
...13.15.12 ... strspn() – erstes Auftreten eines Zeichens, das nicht vorkommt ... 277
...13.15.13 ... strstr() – String nach Auftreten eines Teilstrings durchsuchen ... 277
...13.15.14 ... strtok() – String anhand bestimmter Zeichen zerlegen ... 278

14 ... Zeiger (Pointer) ... 281
14.1 ... Zeiger deklarieren ... 281
14.2 ... Zeiger initialisieren ... 282
...14.2.1 ... Speichergröße von Zeigern ... 294
14.3 ... Zeigerarithmetik ... 295
14.4 ... Zeiger, die auf andere Zeiger verweisen ... 295
...14.4.1 ... Subtraktion zweier Zeiger ... 297
14.5 ... Typensicherung bei der Dereferenzierung ... 298
14.6 ... Zeiger als Funktionsparameter (call-by-reference) ... 298
...14.6.1 ... Zeiger als Rückgabewert ... 302
14.7 ... Array und Zeiger ... 305
14.8 ... Zeiger auf Strings ... 313
...14.8.1 ... Zeiger auf konstante Objekte (Read-only-Zeiger) ... 314
14.9 ... Zeiger auf Zeiger und Stringtabellen ... 315
...14.9.1 ... Stringtabellen ... 316
14.10 ... Zeiger auf Funktionen ... 325
14.11 ... void-Zeiger ... 331
14.12 ... Äquivalenz zwischen Zeigern und Arrays ... 334

15 ... Kommandozeilenargumente ... 339
15.1 ... Argumente an die Hauptfunktion ... 339
15.2 ... Optionen (Schalter) aus der Kommandozeile auswerten ... 345

16 ... Dynamische Speicherverwaltung ... 351
16.1 ... Das Speicherkonzept ... 351
16.2 ... Speicheralloziierung mit malloc() ... 352
16.3 ... Die Mysterie von NULL ... 356
...16.3.1 ... NULL für Fortgeschrittene ... 356
...16.3.2 ... Was jetzt – NULL, 0 oder \0 ... ? ... 358
...16.3.3 ... Zusammengefasst ... 358
16.4 ... Speicherreservierung und ihre Probleme ... 359
16.5 ... free() – Speicher wieder freigeben ... 360
16.6 ... Die Freispeicherverwaltung ... 363
...16.6.1 ... Prozessinterne Freispeicherverwaltung ... 365
16.7 ... Dynamisches Array ... 367
16.8 ... Speicher dynamisch reservieren mit realloc und calloc ... 371
16.9 ... Speicher vom Stack anfordern mit alloca (nicht ANSI C) ... 375
16.10 ... free – Speicher wieder freigeben ... 375
16.11 ... Zweidimensionale dynamische Arrays ... 376
16.12 ... Wenn die Speicheralloziierung fehlschlägt ... 379
...16.12.1 ... Speicheranforderung reduzieren ... 380
...16.12.2 ... Speicheranforderungen aufteilen ... 381
...16.12.3 ... Einen Puffer konstanter Größe verwenden ... 382
...16.12.4 ... Zwischenspeichern auf Festplatte vor der Alloziierung ... 383
...16.12.5 ... Nur so viel Speicher anfordern wie nötig ... 383

17 ... Strukturen ... 385
17.1 ... Struktur deklarieren ... 385
17.2 ... Initialisierung und Zugriff auf Strukturen ... 386
17.3 ... Strukturen als Wertübergabe an eine Funktion ... 391
17.4 ... Strukturen als Rückgabewert einer Funktion ... 393
17.5 ... Strukturen vergleichen ... 395
17.6 ... Arrays von Strukturen ... 397
17.7 ... Strukturen in Strukturen (Nested Structures) ... 404
17.8 ... Kurze Zusammenfassung zu den Strukturen ... 415
17.9 ... Union ... 416
17.10 ... Aufzählungstyp enum ... 421
17.11 ... Typendefinition mit typedef ... 424
17.12 ... Attribute von Strukturen verändern (nicht ANSI C) ... 428
17.13 ... Bitfelder ... 431
17.14 ... Das offsetof-Makro ... 438

18 ... Ein-/Ausgabe-Funktionen ... 441
18.1 ... Was ist eine Datei? ... 441
18.2 ... Formatierte und unformatierte Ein-/Ausgabe ... 441
18.3 ... Streams ... 442
18.4 ... Höhere Ein-/Ausgabe-Funktionen ... 442
18.5 ... Datei (Stream) öffnen – fopen ... 443
...18.5.1 ... Modus für fopen() ... 446
...18.5.2 ... Maximale Anzahl geöffneter Dateien – FOPEN_MAX ... 448
18.6 ... Zeichenweise Lesen und Schreiben – getchar und putchar ... 449
...18.6.1 ... Ein etwas portableres getch() ... 451
18.7 ... Zeichenweise Lesen und Schreiben – putc/fputc und getc/fgetc ... 453
18.8 ... Datei (Stream) schließen – fclose ... 459
18.9 ... Formatiertes Einlesen/Ausgeben von Streams mit fprintf und fscanf ... 462
18.10 ... Standard-Streams in C ... 467
...18.10.1 ... Standard-Streams umleiten ... 468
18.11 ... Fehlerbehandlung von Streams – feof, ferror und clearerr ... 470
18.12 ... Gelesenes Zeichen in die Eingabe zurück-schieben – ungetc ... 472
18.13 ... (Tastatur-)Puffer leeren – fflush ... 474
...18.13.1 ... Pufferung ... 475
18.14 ... Stream positionieren – fseek, rewind und ftell ... 476
18.15 ... Stream positionieren – fsetpos, fgetpos ... 480
18.16 ... Zeilenweise Ein-/Ausgabe von Streams ... 481
...18.16.1 ... Zeilenweise Lesen mit gets/fgets ... 481
...18.16.2 ... Zeilenweise Schreiben mit puts/fputs ... 485
...18.16.3 ... Zeilenweise Einlesen vom Stream mit getline() (nicht ANSI ... C) ... 486
...18.16.4 ... Rezepte für zeilenweises Einlesen und Ausgeben ... 488
18.17 ... Blockweise Lesen und Schreiben – fread und fwrite ... 496
...18.17.1 ... Blockweises Lesen – fread() ... 497
...18.17.2 ... Blockweises Schreiben – fwrite() ... 498
...18.17.3 ... Big-Endian und Little-Endian ... 503
18.18 ... Datei (Stream) erneut öffnen – freopen ... 506
18.19 ... Datei löschen oder umbenennen – remove und rename ... 507
...18.19.1 ... remove() ... 507
...18.19.2 ... rename() ... 509
18.20 ... Pufferung einstellen – setbuf und setvbuf ... 510
18.21 ... Temporäre Dateien erzeugen – tmpfile und tmpnam ... 516
...18.21.1 ... mkstemp() – Sichere Alternative für Linux/UNIX (nicht ANSI ... C) ... 520
18.22 ... Fehlerausgabe mit strerror und perror ... 521
18.23 ... Formatiert in einem String schreiben und formatiert aus einem String lesen – sscanf und sprintf ... 525
18.24 ... Fortgeschrittenes Thema ... 529
18.25 ... Low-Level-Datei-I/O-Funktionen (nicht ANSI C) ... 537
18.26 ... Datei öffnen – open ... 538
18.27 ... Datei schließen – close ... 545
18.28 ... Datei erzeugen – creat ... 546
18.29 ... Schreiben und Lesen – write und read ... 547
18.30 ... File-Deskriptor positionieren – lseek ... 558
18.31 ... File-Deskriptor von einem Stream – fileno ... 559
18.32 ... Stream von File-Deskriptor – fdopen ... 560

19 ... Attribute von Dateien und Arbeiten mit Verzeichnissen (nicht ANSI C) ... 563
19.1 ... Attribute einer Datei ermitteln – stat() ... 563
...19.1.1 ... stat() – st_mode ... 564
...19.1.2 ... stat() – st_size ... 570
...19.1.3 ... stat() – st_atime, st_mtime und st_ctime ... 571
...19.1.4 ... stat() – st_gid und st_uid ... 576
...19.1.5 ... stat() – st_nlink, st_ino ... 577
...19.1.6 ... stat() – st_dev, st_rdev ... 577
19.2 ... Prüfen des Zugriffsrechts – access ... 580
19.3 ... Verzeichnis-Funktionen ... 583
...19.3.1 ... Verzeichnis erstellen, löschen und wechseln – mkdir, rmdir und chdir ... 583
...19.3.2 ... Wechseln in das Arbeitsverzeichnis – getcwd ... 589
...19.3.3 ... Verzeichnisse öffnen, lesen und schließen – opendir, readdir und closedir ... 591

20 ... Arbeiten mit variablen langen Argumentlisten – ... 597
20.1 ... Makros in – va_list, va_arg, va_start und va_end ... 597
20.2 ... Argumentliste am Anfang oder Ende kennzeichnen ... 598
20.3 ... vprintf, vsprintf und vfsprintf ... 602

21 ... Zeitroutinen ... 607
21.1 ... Die Headerdatei ... 607
...21.1.1 ... Konstanten in der Headerdatei ... 608
...21.1.2 ... Datums – und Zeitfunktionen in ... 608
21.2 ... Laufzeitmessung (Profiling) ... 618

22 ... Weitere Headerdateien und ihre Funktionen (ANSI C) ... 621
22.1 ... -– Testmöglichkeiten und Fehlersuche ... 621
22.2 ... – Zeichenklassifizierung und Umwandlung ... 623
22.3 ... Mathematische Funktionen – ... 626
22.4 ... ... 628
...22.4.1 ... Programmbeendigung – exit(), _exit(), atexit() und abort() ... 628
...22.4.2 ... Konvertieren von Strings in numerische Werte ... 631
...22.4.3 ... Bessere Alternative – Konvertieren von Strings in numerische Werte ... 633
...22.4.4 ... Zufallszahlen ... 638
...22.4.5 ... Absolutwerte, Quotient und Rest von Divisionen ... 639
...22.4.6 ... Suchen und Sortieren – qsort() und bsearch() ... 641
...22.4.7 ... system() ... 644
22.5 ... – Länderspezifische Eigenheiten ... 645
22.6 ... ... 648
22.7 ... ... 653
22.8 ... – Die mem…-Funktionen zur Speichermanipulation ... 658
...22.8.1 ... memchr() – Suche nach einzelnen Zeichen ... 658
...22.8.2 ... memcmp() – Bestimmte Anzahl von Bytes vergleichen ... 659
...22.8.3 ... memcpy() – Bestimmte Anzahl von Bytes kopieren ... 660
...22.8.4 ... memmove() – Bestimmte Anzahl von Bytes kopieren ... 660
...22.8.5 ... memset() – Speicherbereich mit bestimmten Zeichen auffüllen ... 661
22.9 ... Erweiterter ANSI C-Standard (ANSI C99) ... 662
...22.9.1 ... Neue elementare Datentypen ... 662
...22.9.2 ... – Ganzzahlige Typen mit vorgegebener Breite ... 662
...22.9.3 ... Komplexe Gleitpunkttypen ... 663
...22.9.4 ... – Symbolische Konstanten für Operatoren ... 663
...22.9.5 ... Deklaration von Bezeichnern ... 664
...22.9.6 ... inline-Funktionen ... 664
...22.9.7 ... Vordefinierte Makros ... 665
...22.9.8 ... – Neue Funktionen ... 666
...22.9.9 ... – (NA1) ... 668
...22.9.10 ... (NA1) ... 668
...22.9.11 ... – Kontrolle der Gleitpunkzahlen-Umgebung ... 669
...22.9.12 ... – Für genauere Integer-Typen ... 669
...22.9.13 ... – Typengenerische Mathematik-Funktionen ... 669
...22.9.14 ... Zusammenfassung ... 670

23 ... Dynamische Datenstrukturen ... 671
23.1 ... Lineare Listen (einfach verkettete Listen) ... 671
...23.1.1 ... Erstes Element der Liste löschen ... 678
...23.1.2 ... Beliebiges Element in der Liste löschen ... 680
...23.1.3 ... Elemente der Liste ausgeben ... 683
...23.1.4 ... Eine vollständige Liste auf einmal löschen ... 689
...23.1.5 ... Element in die Liste einfügen ... 691
23.2 ... Doppelt verkettete Listen ... 698
23.3 ... Stacks nach dem LIFO (Last-in-First-out)-Prinzip ... 715
23.4 ... Queues nach dem FIFO-Prinzip ... 737

24 ... Algorithmen ... 747
24.1 ... Was sind Algorithmen? ... 747
24.2 ... Wie setze ich Algorithmen ein? ... 747
24.3 ... Sortieralgorithmen ... 748
...24.3.1 ... Selektion Sort – Sortieren durch Auswählen ... 748
...24.3.2 ... Insertion Sort ... 750
...24.3.3 ... Bubble Sort ... 752
...24.3.4 ... Shellsort ... 754
...24.3.5 ... Quicksort ... 758
...24.3.6 ... qsort() ... 764
...24.3.7 ... Zusammenfassung der Sortieralgorithmen ... 766
24.4 ... Suchalgorithmen – Grundlage zur Suche ... 774
...24.4.1 ... Lineare Suche ... 775
...24.4.2 ... Binäre Suche ... 777
...24.4.3 ... Binäre (Such-)Bäume ... 780
...24.4.4 ... Elemente im binären Baum einordnen ... 782
...24.4.5 ... Binäre Bäume travesieren ... 787
...24.4.6 ... Löschen eines Elements im binären Baum ... 788
...24.4.7 ... Ein binärer Suchbaum in der Praxis ... 791
...24.4.8 ... Binäre Suchbäume mit Eltern-Zeiger und Threads ... 801
...24.4.9 ... Ausgeglichene Binärbäume ... 802
...24.4.10 ... Algorithmen für ausgeglichene Bäume – eine Übersicht ... 803
24.5 ... Hashing (Zerhacken) ... 804
...24.5.1 ... Wann wird Hashing verwendet? ... 804
...24.5.2 ... Was ist für das Hashing erforderlich? ... 804
...24.5.3 ... Hash-Funktion ... 809
...24.5.4 ... Hashing mit direkter Adressierung ... 814
...24.5.5 ... Vergleich von Hashing mit binären Bäumen ... 814
24.6 ... String-Matching ... 815
...24.6.1 ... Brute-Force-Algorithmus ... 816
...24.6.2 ... Der Algorithmus von Knuth/Morris/Pratt (KMP) ... 819
...24.6.3 ... Weitere String-Matching-Algorithmen ... 826
24.7 ... Pattern Matching (reguläre Ausdrücke) ... 826
24.8 ... Backtracking ... 833
...24.8.1 ... Der Weg durch den Irrgarten ... 833
...24.8.2 ... Das 8-Dame-Problem ... 847

25 ... Sicheres Programmieren ... 857
25.1 ... Buffer Overflow (Speicherüberlauf) ... 858
...25.1.1 ... Speicherverwaltung von Programmen ... 859
...25.1.2 ... Der Stack-Frame ... 860
...25.1.3 ... Rücksprungadresse manipulieren ... 861
...25.1.4 ... Gegenmaßnahmen zum Buffer Overflow während der Programmerstellung ... 868
...25.1.5 ... Gegenmaßnahmen zum Buffer Overflow, wenn das Programm fertig ist ... 871
...25.1.6 ... Programme und Tools zum Buffer Overflow ... 874
...25.1.7 ... Ausblick ... 875
25.2 ... Memory Leaks (Speicherlecks) ... 876
...25.2.1 ... Bibliotheken und Tools zu Memory Leaks ... 880
25.3 ... Tipps zu Sicherheitsproblemen ... 881

26 ... CGI mit C ... 883
26.1 ... Was ist CGI? ... 883
26.2 ... Vorteile von CGIs in C ... 883
26.3 ... Andere Techniken der Webprogrammierung ... 884
26.4 ... Das dreistufige Webanwendungsdesign ... 885
...26.4.1 ... Darstellungsschicht ... 885
...26.4.2 ... Verarbeitungsschicht ... 886
...26.4.3 ... Speicherschicht ... 886
26.5 ... Clientseitige Programmierung ... 887
...26.5.1 ... JavaScript ... 887
...26.5.2 ... Java-Applets ... 887
26.6 ... Serverseitige Programmierung ... 887
26.7 ... Der Webserver ... 888
...26.7.1 ... Das Client/Server-Modell des Internets ... 888
...26.7.2 ... Serverimplementierung ... 889
...26.7.3 ... Hosting-Services ... 890
...26.7.4 ... Schlüsselfertige Lösung ... 890
...26.7.5 ... Weitere Möglichkeiten ... 891
...26.7.6 ... Apache ... 891
26.8 ... Das HTTP-Protokoll ... 901
...26.8.1 ... Web-Protokolle ... 901
...26.8.2 ... Wozu Protokolle? ... 901
...26.8.3 ... Was ist ein Protokoll? ... 901
...26.8.4 ... Normen für die Netzwerktechnik ... 902
...26.8.5 ... Das OSI-Schichtenmodell ... 902
...26.8.6 ... Die Elemente einer URL ... 903
...26.8.7 ... Client-Anfrage – HTTP Request (Browser-Request) ... 905
...26.8.8 ... Serverantwort (Server-Response) ... 908
...26.8.9 ... Zusammenfassung ... 911
26.9 ... Das Common Gateway Interface (CGI) ... 911
...26.9.1 ... Filehandles ... 911
...26.9.2 ... CGI-Umgebungsvariablen ... 912
...26.9.3 ... CGI-Ausgabe ... 917
26.10 ... HTML-Formulare ... 920
...26.10.1 ... Die Tags und ihre Bedeutung ... 920
26.11 ... CGI-Eingabe ... 927
...26.11.1 ... Die Anfrage des Clients an den Server ... 927
...26.11.2 ... Eingabe parsen ... 931
26.12 ... Ein Gästebuch ... 936
...26.12.1 ... Das HTML-Formular (guestbook.html) ... 936
...26.12.2 ... Das CGI-Programm (auswert.cgi) ... 938
...26.12.3 ... Das HTML-Gästebuch (gaeste.html) ... 947
...26.12.4 ... Das Beispiel ausführen ... 947
26.13 ... Ausblick ... 949

27 ... MySQL und C ... 951
27.1 ... Aufbau eines Datenbanksystems ... 951
...27.1.1 ... Warum wurde ein Datenbanksystem (DBS) entwickelt? ... 951
...27.1.2 ... Das Datenbank-Management-System (DBMS) ... 952
...27.1.3 ... Relationale Datenbank ... 954
...27.1.4 ... Eigene Clients mit C für SQL mit der ODBC-API entwickeln ... 955
27.2 ... MySQL installieren ... 956
...27.2.1 ... Linux ... 956
...27.2.2 ... Windows ... 956
...27.2.3 ... Den Client mysql starten ... 957
27.3 ... Crashkurs (My)SQL ... 958
...27.3.1 ... Was ist SQL? ... 958
...27.3.2 ... Die Datentypen von (My)SQL ... 958
...27.3.3 ... Eine Datenbank erzeugen ... 960
...27.3.4 ... Eine Datenbank löschen ... 961
...27.3.5 ... Datenbank wechseln ... 962
...27.3.6 ... Eine Tabelle erstellen ... 962
...27.3.7 ... Die Tabelle anzeigen ... 963
...27.3.8 ... Tabellendefinition überprüfen ... 963
...27.3.9 ... Tabelle löschen ... 964
...27.3.10 ... Struktur einer Tabelle ändern ... 964
...27.3.11 ... Datensätze eingeben ... 965
...27.3.12 ... Datensätze auswählen ... 966
...27.3.13 ... Ein fortgeschrittenes Szenario ... 967
...27.3.14 ... Datensatz löschen ... 968
...27.3.15 ... Datensatz ändern ... 968
...27.3.16 ... Zugriffsrechte in MySQL ... 968
...27.3.17 ... Übersicht über einige SQL-Kommandos ... 970
27.4 ... Die MySQL C-API ... 971
...27.4.1 ... Grundlagen zur Programmierung eines MySQL-Clients ... 971
...27.4.2 ... Client-Programm mit dem gcc- unter Linux und dem Cygwin gcc-Compiler unter Windows ... 973
...27.4.3 ... MySQL Client-Programme mit dem VC++ Compiler und dem Borland Freeware Compiler ... 973
...27.4.4 ... Troubleshooting ... 975
...27.4.5 ... Das erste Client-Programm – Verbindung mit dem MySQL-Server herstellen ... 975
...27.4.6 ... MySQL-Kommandozeilen-Optionen ... 980
...27.4.7 ... Anfrage an den Server ... 983
27.5 ... MySQL und C mit CGI ... 1003
...27.5.1 ... HTML-Eingabeformular ... 1003
...27.5.2 ... CGI-Anwendung add_db.cgi ... 1004
...27.5.3 ... CGI-Anwendung search_db.cgi ... 1013
27.6 ... Funktionsübersicht ... 1022
27.7 ... Datentypenübersicht der C-API ... 1025

28 ... Netzwerkprogrammierung und Cross-Plattform-Entwicklung ... 1027
28.1 ... Begriffe zur Netzwerktechnik ... 1027
...28.1.1 ... IP-Nummern ... 1028
...28.1.2 ... Portnummer ... 1029
...28.1.3 ... Host- und Domainname ... 1030
...28.1.4 ... Nameserver ... 1030
...28.1.5 ... Das IP-Protokoll ... 1031
...28.1.6 ... TCP und UDP ... 1031
...28.1.7 ... Was sind Sockets? ... 1032
28.2 ... Headerdateien zur Socketprogrammierung ... 1033
...28.2.1 ... Linux/UNIX ... 1033
...28.2.2 ... Windows ... 1033
28.3 ... Client-/Server-Prinzip ... 1036
...28.3.1 ... Loopback-Interface ... 1036
28.4 ... Erstellen einer Client-Anwendung ... 1037
...28.4.1 ... socket() – Erzeugen eines Kommunikationsendpunktes ... 1037
...28.4.2 ... connect() – Client stellt Verbindung zum Server her ... 1039
...28.4.3 ... Senden und Empfangen von Daten ... 1044
...28.4.4 ... close(), closesocket() ... 1047
28.5 ... Erstellen einer Server-Anwendung ... 1048
...28.5.1 ... bind() – Festlegen einer Adresse aus dem Namensraum ... 1048
...28.5.2 ... listen() – Warteschlange für eingehende Verbindungen einrichten ... 1050
...28.5.3 ... accept() und die Serverhauptschleife ... 1051
28.6 ... (Cross-Plattform)TCP-Echo-Server ... 1054
...28.6.1 ... Der Client ... 1054
...28.6.2 ... Der Server ... 1057
28.7 ... Cross-Plattform-Development ... 1061
...28.7.1 ... Abstraktion Layer ... 1062
...28.7.2 ... Headerdatei Linux/UNIX ... 1062
...28.7.3 ... Linux/UNIX-Quelldatei ... 1063
...28.7.4 ... Headerdatei MS-Windows ... 1067
...28.7.5 ... Windows-Quelldatei ... 1068
...28.7.6 ... All together – die main-Funktionen ... 1072
...28.7.7 ... Ein UDP-Beispiel ... 1075
...28.7.8 ... Mehrere Clients gleichzeitig behandeln ... 1078
28.8 ... Weitere Anmerkungen zur Netzwerkprogrammierung ... 1086
...28.8.1 ... Das Datenformat ... 1086
...28.8.2 ... Der Puffer ... 1087
...28.8.3 ... Portabilität ... 1088
...28.8.4 ... Von IPv4 nach IPv6 ... 1088
...28.8.5 ... RFC-Dokumente (Request for Comments) ... 1090
...28.8.6 ... Sicherheit ... 1090

29 ... Wie geht’s jetzt weiter? ... 1091
29.1 ... GUI-Programmierung – Grafische Oberflächen ... 1091
...29.1.1 ... Low-Level-Grafikprogrammierung ... 1092
...29.1.2 ... High-Level-Grafikprogrammierung ... 1092
...29.1.3 ... Mutimedia-Grafikprogrammierung ... 1093

A ... Anhang ... 1095
A.1 ... Rangfolge der Operatoren ... 1095
A.2 ... ASCII-Code-Tabelle ... 1097
A.3 ... Reservierte Schlüsselwörter in C ... 1098
A.4 ... Standard-Headerdateien der ANSI C-Bibliothek ... 1098
A.5 ... Weiterführende Links ... 1098
A.6 ... Weiterführende Literatur ... 1098
A.6.1 ... Bücher zum ANSI C-Standard ... 1099
A.6.2 ... Algorithmen und Datenstrukturen ... 1099
A.6.3 ... HTML, CGI-Webprogrammierung ... 1100
A.6.4 ... Linux/UNIX ... 1100
A.6.5 ... MySQL ... 1101

Index ... 1103