Algorithmen und Datenstrukturen 3.2 Auswahl an Stringfunktionen W. Tasin, M.Sc. Fakultät 04 tasin@hm.edu
Allgemeines (1) Die ANSI-Norm definiert auch nützliche Funktionen zur ASCIIZ-Stringbearbeitung. In diesem Kapitel wird nur eine Auswahl an Stringfunktionen der Standardbibliothek dargestellt. Diese sind in der Include-Datei string.h deklariert und in der C-Standardbibliothek definiert. Wie bereits im Kapitel "Arrays" dargestellt, interpretieren diese Funktionen die Komponenten eines char-arrays bis zum abschließenden NUL-Zeichen ('\0'). Der NULL-Pointer darf keiner Funktion als Parameter übergeben werden Speicherfehler. Algorithmen und Datenstrukturen - W. Tasin, M.Sc. 2
Allgemeines (2) Die Funktionen verwenden überwiegend folgende Typen: size_t entspricht dem Typ unsigned int. Wird als Typ für eine Längenangabe oder eine Position im String verwendet. const char * Zeiger auf die Speicherstelle des ersten Zeichens einer konstanten Zeichenkette. Man zeigt damit an, dass innerhalb der Funktion die referierten Speicherinhalte nicht geändert werden. Wird als Typ für die Startadresse auf einen String verwendet, der nur gelesen wird (z. B. zu kopierender String). char * Zeiger auf die Speicherstelle eines char-arrays dessen Komponenten modifizierbar sein soll. Wird als Typ für die Startadresse auf einen String verwendet, der modifiziert wird (z. B. Speicherbereich in den ein String kopiert wird). Algorithmen und Datenstrukturen - W. Tasin, M.Sc. 3
Stringlänge size_t strlen(const char *str); Ermittelt die Stringlänge durch Suchen nach der Speicherstelle (ab der Adresse str), die das NUL-Zeichen beinhaltet. Verwendung der Standardfunktion #include <string.h> /*... */ char *quest = "Wer, wie, was?"; size_t laenge=strlen("hallo"); laenge=strlen(quest); laenge = 5 laenge = 14 Nachbildung einer eigenen strlen-funktion unsigned mystrlen(const char *str) { unsigned len=0; while (str[len]!='\0') len++; return len; } Algorithmen und Datenstrukturen - W. Tasin, M.Sc. 4
Stringkopie char *strcpy(char *dest, const char *src); Kopiert den String ab Adresse src in den Speicher, der durch die Adresse in dest (und folgende) referiert wird. Ab der Adresse dest muss genügend Speicherplatz reserviert worden sein! Liefert als Rückgabewert die Adresse dest. Verwendung der Standardfunktion #include <string.h> /*... */ char mess[80+1]; strcpy(mess, "Oops"); mess[0] = 'O' mess[1] = 'o' mess[2] = 'p' mess[3] = 's' mess[4] = '\0' char *mystrcpy(char *dest, const char *src) { } Nachbildung einer eigenen strcpy-funktion unsigned i, len=mystrlen(src); for (i=0; i<=len; i++) dest[i]=src[i]; return dest; Algorithmen und Datenstrukturen - W. Tasin, M.Sc. 5
Stringkonkatenation char *strcat(char *s1, const char *s2); Hängt an den String, der durch die Adresse s1 referiert wird, den String ab s2 an. Ab der Adresse s1 muss genügend Speicherplatz reserviert worden sein! Liefert als Rückgabewert die Adresse s1. Verwendung der Standardfunktion Nachbildung einer eigenen strcat-funktion #include <string.h> /*... */ char part[80+1]="teil"; strcat(part, "er."); mess[0] = 'T' mess[1] = 'e' mess[2] = 'i' mess[3] = 'l' mess[4] = 'e' mess[5] = 'r' mess[6] = '.' mess[7]='\0' char *mystrcat(char *s1, const char *s2) { } unsigned len=mystrlen(s1); mystrcpy(s1+len, s2); return s1; Algorithmen und Datenstrukturen - W. Tasin, M.Sc. 6
Stringvergleich (1) Um zwei Strings zu vergleichen und eine alphabetische Ordnung zu erzeugen, werden die Zeichen (ASCII-Werte) des gleichen Index miteinander verglichen. Groß-/Kleinschreibung wird beachtet Kleinbuchstaben haben größeren ASCII-Wert Umlaute und ß werden nicht korrekt betrachtet Solange die Zeichen des gleichen Index gleich sind und ein Stringende noch nicht erreicht, springt man zum nächsten Index und vergleicht deren Komponentenwerte. Sind zwei Zeichen gleichen Index jedoch ungleich, so kann man feststellen, welcher String alphabetisch nach dem anderen folgt. Ist man am Ende eines Strings angelangt und sind alle bisher getesteten Komponenten gleich gewesen, dann sind beide Strings gleich. s1 P a s t \0 s1 P a r T \0 s1 P a s t \0 s2 P a r t \0 s2 P a r t \0 s2 P a s t \0 Algorithmen und Datenstrukturen - W. Tasin, M.Sc. 7
Stringvergleich (2) int strcmp(const char *s1, const char *s2); Vergleicht zeichenweise den String ab s1 mit dem String ab s2. Liefert einen positiven Wert wenn der String s1 "größer" als s2 ist, einen negativen Wert falls s1 "kleiner" als s2 ist und den Wert 0 falls die Strings gleich sind. Verwendung der Standardfunktion #include <string.h> /*... */ char part1[80+1]="teil"; int cmp=strcmp(part1, "Teil"); cmp=strcmp(part1, "teil"); cmp=strcmp(part1, "Tei"); cmp = 0 cmp < 0 cmp > 0 int mystrcmp(const char *s1, const char *s2) { } Nachbildung einer eigenen strcmp-funktion int cmp=0, i=0; while ((cmp=s1[i]-s2[i])==0 && s1[i]!='\0') i++; return cmp; Algorithmen und Datenstrukturen - W. Tasin, M.Sc. 8