C vereint widersprüchliche Eigenschaften:
Maschinennähe und Portabilität. C ist in die Jahre gekommen, hat aber an Attraktivität keineswegs verloren.
Dieses Buch bietet Programmiereinsteigern und Studenten technischer Fächer einen umfassenden Einstieg in C. Auch für fortgeschrittene C-Programmierer ist das Buch eine ausgezeichnete Fundgrube. Die Website zum Buch (www.pronix.de) bietet ein Forum und jede Menge zusätzliches Know-how.
Inhaltsverzeichnis:
1 Einstieg in C ... 27
1.1 Übersicht zu C ... 27
1.2 Der ANSI C-Standard ... 28
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.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.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.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.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.13 Umwandlungsvorgaben für formatierte Ein-/Ausgabe ... 90
8 Operatoren ... 97
8.1 Exkurs zu Operatoren ... 97
8.2 Arithmetische Operatoren ... 98
8.3 Erweiterte Darstellung arithmetischer Operatoren ... 101
8.4 Inkrement- und Dekrement-Operatoren ... 102
8.5 Bit-Operatoren ... 103
8.6 sizeof-Operator ... 111
9 Typenumwandlung ... 115
10 Kontrollstrukturen ... 117
10.1 Verzweigungen mit der if-Bedingung ... 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.8 Die while-Schleife ... 138
10.9 Die do while-Schleife ... 142
10.10 Die for-Schleife ... 146
10.11 Kontrollierte Sprünge ... 153
10.12 Direkte Sprünge mit goto ... 155
10.13 Notationsstil ... 156
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.10 Typ-Qualifizierer ... 170
11.11 Geltungsbereich von Variablen ... 171
11.12 Speicherklassen-Spezifizierer für Funktionen ... 172
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
12 Präprozessor-Direktiven ... 199
12.1 Einkopieren von Dateien mittels #include ... 199
12.2 Makros und Konstanten - #define ... 203
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.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.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.14 Einlesen von Strings ... 266
13.15 Standard-Bibliothek 268
14 Zeiger (Pointer) ... 281
14.1 Zeiger deklarieren ... 281
14.2 Zeiger initialisieren ... 282
14.3 Zeigerarithmetik ... 295
14.4 Zeiger, die auf andere Zeiger verweisen ... 295
14.5 Typensicherung bei der Dereferenzierung ... 298
14.6 Zeiger als Funktionsparameter (call-by-reference) ... 298
14.7 Array und Zeiger ... 305
14.8 Zeiger auf Strings ... 313
14.9 Zeiger auf Zeiger und Stringtabellen ... 315
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.4 Speicherreservierung und ihre Probleme ... 359
16.5 free() - Speicher wieder freigeben ... 360
16.6 Die Freispeicherverwaltung ... 363
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
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.6 Zeichenweise Lesen und Schreiben - getchar und putchar ... 449
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.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.14 Stream positionieren - fseek, rewind und ftell ... 476
18.15 Stream positionieren - fsetpos, fgetpos ... 480
18.16 Zeilenweise Ein-/Ausgabe von Streams ... 481
18.17 Blockweise Lesen und Schreiben - fread und fwrite ... 496
18.18 Datei (Stream) erneut öffnen - freopen ... 506
18.19 Datei löschen oder umbenennen - remove und rename ... 507
18.20 Pufferung einstellen - setbuf und setvbuf ... 510
18.21 Temporäre Dateien erzeugen - tmpfile und tmpnam ... 516
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.2 Prüfen des Zugriffsrechts - access ... 580
19.3 Verzeichnis-Funktionen ... 583
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.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.5 - Länderspezifische Eigenheiten ... 645
22.6 648
22.7 653
22.8 - Die mem...-Funktionen zur Speichermanipulation ... 658
22.9 Erweiterter ANSI C-Standard (ANSI C99) ... 662
23 Dynamische Datenstrukturen ... 671
23.1 Lineare Listen (einfach verkettete Listen) ... 671
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.4 Suchalgorithmen - Grundlage zur Suche ... 774
24.5 Hashing (Zerhacken) ... 804
24.6 String-Matching ... 815
24.7 Pattern Matching (reguläre Ausdrücke) ... 826
24.8 Backtracking ... 833
25 Sicheres Programmieren ... 857
25.1 Buffer Overflow (Speicherüberlauf) ... 858
25.2 Memory Leaks (Speicherlecks) ... 876
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.5 Clientseitige Programmierung ... 887
26.6 Serverseitige Programmierung ... 887
26.7 Der Webserver ... 888
26.8 Das HTTP-Protokoll ... 901
26.9 Das Common Gateway Interface (CGI) ... 911
26.10 HTML-Formulare ... 920
26.11 CGI-Eingabe ... 927
26.12 Ein Gästebuch ... 936
26.13 Ausblick ... 949
27 MySQL und C ... 951
27.1 Aufbau eines Datenbanksystems ... 951
27.2 MySQL installieren ... 956
27.3 Crashkurs (My)SQL ... 958
27.4 Die MySQL C-API ... 971
27.5 MySQL und C mit CGI ... 1003
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.2 Headerdateien zur Socketprogrammierung ... 1033
28.3 Client-/Server-Prinzip ... 1036
28.4 Erstellen einer Client-Anwendung ... 1037
28.5 Erstellen einer Server-Anwendung ... 1048
28.6 (Cross-Plattform)TCP-Echo-Server ... 1054
28.7 Cross-Plattform-Development ... 1061
28.8 Weitere Anmerkungen zur Netzwerkprogrammierung ... 1086
29 Wie geht's jetzt weiter? ... 1091
29.1 GUI-Programmierung - Grafische Oberflächen ... 1091
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
Maschinennähe und Portabilität. C ist in die Jahre gekommen, hat aber an Attraktivität keineswegs verloren.
Dieses Buch bietet Programmiereinsteigern und Studenten technischer Fächer einen umfassenden Einstieg in C. Auch für fortgeschrittene C-Programmierer ist das Buch eine ausgezeichnete Fundgrube. Die Website zum Buch (www.pronix.de) bietet ein Forum und jede Menge zusätzliches Know-how.
Inhaltsverzeichnis:
1 Einstieg in C ... 27
1.1 Übersicht zu C ... 27
1.2 Der ANSI C-Standard ... 28
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.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.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.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.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.13 Umwandlungsvorgaben für formatierte Ein-/Ausgabe ... 90
8 Operatoren ... 97
8.1 Exkurs zu Operatoren ... 97
8.2 Arithmetische Operatoren ... 98
8.3 Erweiterte Darstellung arithmetischer Operatoren ... 101
8.4 Inkrement- und Dekrement-Operatoren ... 102
8.5 Bit-Operatoren ... 103
8.6 sizeof-Operator ... 111
9 Typenumwandlung ... 115
10 Kontrollstrukturen ... 117
10.1 Verzweigungen mit der if-Bedingung ... 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.8 Die while-Schleife ... 138
10.9 Die do while-Schleife ... 142
10.10 Die for-Schleife ... 146
10.11 Kontrollierte Sprünge ... 153
10.12 Direkte Sprünge mit goto ... 155
10.13 Notationsstil ... 156
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.10 Typ-Qualifizierer ... 170
11.11 Geltungsbereich von Variablen ... 171
11.12 Speicherklassen-Spezifizierer für Funktionen ... 172
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
12 Präprozessor-Direktiven ... 199
12.1 Einkopieren von Dateien mittels #include ... 199
12.2 Makros und Konstanten - #define ... 203
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.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.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.14 Einlesen von Strings ... 266
13.15 Standard-Bibliothek
14 Zeiger (Pointer) ... 281
14.1 Zeiger deklarieren ... 281
14.2 Zeiger initialisieren ... 282
14.3 Zeigerarithmetik ... 295
14.4 Zeiger, die auf andere Zeiger verweisen ... 295
14.5 Typensicherung bei der Dereferenzierung ... 298
14.6 Zeiger als Funktionsparameter (call-by-reference) ... 298
14.7 Array und Zeiger ... 305
14.8 Zeiger auf Strings ... 313
14.9 Zeiger auf Zeiger und Stringtabellen ... 315
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.4 Speicherreservierung und ihre Probleme ... 359
16.5 free() - Speicher wieder freigeben ... 360
16.6 Die Freispeicherverwaltung ... 363
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
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.6 Zeichenweise Lesen und Schreiben - getchar und putchar ... 449
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.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.14 Stream positionieren - fseek, rewind und ftell ... 476
18.15 Stream positionieren - fsetpos, fgetpos ... 480
18.16 Zeilenweise Ein-/Ausgabe von Streams ... 481
18.17 Blockweise Lesen und Schreiben - fread und fwrite ... 496
18.18 Datei (Stream) erneut öffnen - freopen ... 506
18.19 Datei löschen oder umbenennen - remove und rename ... 507
18.20 Pufferung einstellen - setbuf und setvbuf ... 510
18.21 Temporäre Dateien erzeugen - tmpfile und tmpnam ... 516
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.2 Prüfen des Zugriffsrechts - access ... 580
19.3 Verzeichnis-Funktionen ... 583
20 Arbeiten mit variablen langen Argumentlisten -
20.1 Makros in
20.2 Argumentliste am Anfang oder Ende kennzeichnen ... 598
20.3 vprintf, vsprintf und vfsprintf ... 602
21 Zeitroutinen ... 607
21.1 Die Headerdatei
21.2 Laufzeitmessung (Profiling) ... 618
22 Weitere Headerdateien und ihre Funktionen (ANSI C) ... 621
22.1
22.2
22.3 Mathematische Funktionen -
22.4
22.5
22.6
22.7
22.8
22.9 Erweiterter ANSI C-Standard (ANSI C99) ... 662
23 Dynamische Datenstrukturen ... 671
23.1 Lineare Listen (einfach verkettete Listen) ... 671
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.4 Suchalgorithmen - Grundlage zur Suche ... 774
24.5 Hashing (Zerhacken) ... 804
24.6 String-Matching ... 815
24.7 Pattern Matching (reguläre Ausdrücke) ... 826
24.8 Backtracking ... 833
25 Sicheres Programmieren ... 857
25.1 Buffer Overflow (Speicherüberlauf) ... 858
25.2 Memory Leaks (Speicherlecks) ... 876
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.5 Clientseitige Programmierung ... 887
26.6 Serverseitige Programmierung ... 887
26.7 Der Webserver ... 888
26.8 Das HTTP-Protokoll ... 901
26.9 Das Common Gateway Interface (CGI) ... 911
26.10 HTML-Formulare ... 920
26.11 CGI-Eingabe ... 927
26.12 Ein Gästebuch ... 936
26.13 Ausblick ... 949
27 MySQL und C ... 951
27.1 Aufbau eines Datenbanksystems ... 951
27.2 MySQL installieren ... 956
27.3 Crashkurs (My)SQL ... 958
27.4 Die MySQL C-API ... 971
27.5 MySQL und C mit CGI ... 1003
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.2 Headerdateien zur Socketprogrammierung ... 1033
28.3 Client-/Server-Prinzip ... 1036
28.4 Erstellen einer Client-Anwendung ... 1037
28.5 Erstellen einer Server-Anwendung ... 1048
28.6 (Cross-Plattform)TCP-Echo-Server ... 1054
28.7 Cross-Plattform-Development ... 1061
28.8 Weitere Anmerkungen zur Netzwerkprogrammierung ... 1086
29 Wie geht's jetzt weiter? ... 1091
29.1 GUI-Programmierung - Grafische Oberflächen ... 1091
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