Programmieren in C Die C-Standardbibliothek Prof. Dr. Nikolaus Wulff
Die C-Standard Bibliothek Mit dem C Compiler werden viel fertige Bibliotheksfunktionen ausgeliefert. Eine genaue Kenntnis dieser Funktionen und Makros erspart viel Programmieraufwand. Die Vorlesung erläutert die generelle Strukturierung und gibt einige Beispiele. Ausgenommen sind Funktionen zum Schreiben und Lesen von z.b. dem Dateisystem. nächste Vorlesung... Prof. Dr. Nikolaus Wulff 2
Header Dateien Um C Funktionen aufrufen zu können, müssen dem Compiler die Funktionsdeklarationen bekannt sein. Hierzu werden die entsprechende Header-Dateien per #include-direktive in den Quelltext aufgenommen. Spitze Klammern <xxx.h> beziehen sich auf Bibliotheken des Entwicklungspfades, ''xxx.h'' auf Header Dateien des aktuellen Projekts. printf Methode per #include <stdio.h> sin Funktion per #include <math.h> ddf-ableitung per #include ''derivative.h'' Prof. Dr. Nikolaus Wulff 3
Die C Standardbibliothek assert.h ctype.h errno.h float.h iso646.h limits.h locale.h math.h setjmp.h Definiert das assert Debug Makro Klassifizierung (is...) und Konvertierung (to...) von Zeichenketten Definiert Fehlerbehandlungsmakros Definiert float min, max, eps, etc. Synonyme für and, bitor, not, xor etc. Definiert char, int,... min max Bereiche Landesspezifische Währung, Zeit, Datum Mathematische Funktionen Sprünge definieren Prof. Dr. Nikolaus Wulff 4
Die C Standardbibliothek cont. signal.h Interrupts und Fehlersignale stdarg.h Funktionen mit variabler Argumentliste stddef.h Makros NULL, size_t, offsetof etc stdio.h Ein- und Ausgabe per Konsole, Datei... stdlib.h Allgemeine Bibliotheksfunktionen string.h Manipulation von Zeichenketten time.h Zeitfunktionen wchar.h Wide Character 16/32-bit Zeichen wctype.h Wide Character Zeichenfunktionen Prof. Dr. Nikolaus Wulff 5
<assert.h> Fehlerbehandlungen Für Entwicklungszwecke dient das assert Makro zum Lokalisieren von Fehlern: assert(<conditon>); Wenn die Bedingung false==0 ist (C kennt keinen boolean!) wird eine Fehlermeldung mit der Zeilennummer der Quelldatei nach stderr geschrieben und das Programm beendet. static double data[max]; double getelement(int index) { assert(0<=index); assert(index<max); return data[index]; } Prof. Dr. Nikolaus Wulff 6
<ctype.h> isalpha/isdigit Mit isalpha & isdigit läßt sich feststellen ob ein Zeichen ein Buchstabe oder eine Zahl ist: void countdigchars(char *s) { int numdigit=0; int numchars=0; } while(*s) { if(isdigit(*s)) numdigit++; if(isalpha(*s)) numchars++; s++; }... Die Routine zählt Zahlen und Buchstaben der übergebenen Zeichenkette... Prof. Dr. Nikolaus Wulff 7
<ctype.h> toupper Mit toupper & tolower lassen sich Zeichen klein oder groß schreiben: Ausgabe: char string[] = "kleingeschrieben"; printf("%s \n", string); int i = strlen(string); while(i--) { string[i] = toupper(string[i]); } printf("%s \n", string); kleingeschrieben KLEINGESCHRIEBEN Prof. Dr. Nikolaus Wulff 8
Manipulation von Zeichenketten C besitzt keinen Datentypen für Zeichenketten und verwendet statt dessen ein Feld char*. Daher gibt es keine Operatoren für Zeichenketten. Z.B. in Java oder C++ funktioniert: String s = "hallo" + " world"; C definiert statt dessen in <string.h> eine Reihe von Funktionen und Makros: char s[] = " "; char *h = "hallo"; char *w = " world"; strcpy(s,h); /* copy h to s */ strcat(s,w); /* append w */ Prof. Dr. Nikolaus Wulff 9
<string.h> Methoden s, t sind Zeiger char* und c, n vom Typ int. strcat(s,t) hängt t an das Ende von s an strncat(s,t,n) hängt n Zeichen von t an s an strcmp(s,t) vergleicht s mit t strncmp(s,t,n) vergleicht n Zeichen von s und t strcpy(s,t) kopiert t nach s strncpy(s,t,n) kopiert n Zeichen von t nach s strlen(s) Länge von s ohne '\0' strchar(s,c) Zeiger auf erstes c in s oder NULL strrchr(s,c) Zeiger auf letztes c in s oder NULL Prof. Dr. Nikolaus Wulff 10
Speicherprobleme Der Zielzeiger bei allen strxxx Methoden muss auf einen Speicherbereich zeigen, der das Ergebnis der Operation aufnehmen kann! Beispiel: Sollen die Zeichenketten "hallo" und " world" zusammengesetzt werden, so muss der Zeiger der Zieladresse auf einen Speicherbereich der Größe (5+6+1)*sizeof(char) zeigen. Ist dieser Speicher nicht richtig dimensioniert worden, so kann es bei größeren Programmen zur nachträglichen Überschreibung oder einem fatalen Abbruch mit Segmentation Fault kommen. Prof. Dr. Nikolaus Wulff 11
<stdlib.h> malloc und free Speicherbereiche werden vor dem Gebrauch mit der Funktion malloc angefordert. malloc liefert einen void* Zeiger. Nach der Verwendung muss der Speicher mit der Methode free wieder freigegeben werden! int len = 100; double *array; array = malloc(len*sizeof(double)); /* check memory is valid */ assert(array!= NULL); /* do something... */ free(array); Prof. Dr. Nikolaus Wulff 12
Speicher anfordern Bei Zeichenkettenoperationen muss immer genügend Speicher mit malloc vom Betriebsystem angefordert werden: char *s1,*s2,*dest; s1 = "irgend eine"; s2 = " lange Zeichenkette"; /* calculate resulting size */ int len = strlen(s1) + strlen(s2) + 1; /* allocate storage from OS */ dest = (char*) malloc(sizeof(char)*len); /* copy and concat strings */ strcpy(dest,s1); /* copy s1 to dest */ strcat(dest,s2); /* append s2 on dest */ printf("%s \n",dest); Prof. Dr. Nikolaus Wulff 13
Zeichenketten vergleichen Die Funktion strcmp vergleicht zwei Zeichenketten lexikalisch und liefert 0 wenn beide Strings gleich sind, ansonsten einen Wert kleiner oder größer 0. char *s1 = "aaac"; char *s2 = "aaea"; printf("%s cmp %s %d \n",s1, s1, strcmp(s1,s1)); printf("%s cmp %s %d \n",s2, s1, strcmp(s2,s1)); printf("%s cmp %s %d \n",s1, s2, strcmp(s1,s2)); Ergebnis: aaac cmp aaac 0 aaea cmp aaac 4 aaac cmp aaea -4 Prof. Dr. Nikolaus Wulff 14
<string.h> Zeichenkette parsen Mit der Funktion strtok lassen sich Zeichenketten in einzelne Wörter (engl. tokens) zerlegen: char *word; char string[] = "eine Zeichenkette mit vielen Wörtern...!"; word = strtok(string," "); while(word) { printf("%s \n", word); word = strtok(null," "); } Ausgabe: eine Zeichenkette mit vielen Wörtern...! Prof. Dr. Nikolaus Wulff 15
Zusammenfassung Die Standard C Bibliothek bietet viele Funktionen bereits for free. Die Namensgebung (6 Buchstaben!) und die Art der Aufrufe (Signatur) sind manchmal recht kryptisch und nicht mehr ganz zeitgemäß... Dennoch es lohnt sich ein Blick in die entsprechende Dokumentation, bevor Routinen unnötig selbst geschrieben werden. Prof. Dr. Nikolaus Wulff 16