|
![ein Kapitel weiter](../weiter.gif)
Zum weiteren Verlauf unseres Kurses werden wir öfters die Headerdatei...
#inlcude <string.h>
...verwenden und auch brauchen. Zuerst werde ich Ihnen Auflisten was für Funktionen darin enthalten sind und anschließend werden ich Ihnen zeigen wie man diese einsetzen kann. Also erst mal hier der Überblick...
memchr |
Zeichen im Speicherblock suchen |
memcmp |
Speicherblöcke vergleichen |
memcpy |
Speicherblöcke kopieren |
memmove |
Sicheres kopieren von Speichblöcken |
memset |
Speicherblock initialisieren |
strcat |
String an einen anderen hängen |
strchr |
Zeichen im String suchen |
strcmp |
Zwei Strings vergleichen |
strcoll |
Zwei Strings umgebungsabhängig vergleichen |
strcpy |
String kopieren |
strerror |
Einen Fehler Verbal ausgeben |
strlen |
Länge des Strings ermitteln |
strncat |
Teil eines Strings an anderen hängen |
strncmp |
Teile von zwei Strings vergleichen |
strncpy |
Teile eines Strings kopieren |
strrchr |
Zeichen von hinten suchen |
strstr |
prüft ob eine String Teil eines anderen ist |
Manche dieser Funktionen werden so gut wie nie eingesetzt manche mehr. Hierzu ein Programmbeispiel....
/*Download:stringh1.c*/
#include <stdio.h> #include <string.h> #define LINIE printf("-----------------------------------\n")
char ziel[100] = {"Hier wird am Ende ein Punkt hingefügt"}; char quelle[] = {"\nJetzt haben wir einen String hinzugetan"}; char backup[100];
int main() {
int ret;
printf("%s\n",ziel); LINIE;
strcat(ziel,"."); printf("strcat(ziel,\".\"): %s\n",ziel); LINIE;
strcat(ziel,quelle); printf("strcat(ziel,quelle):%s\n",ziel); LINIE;
printf("Wir machen eine Kopie von 'ziel'\n"); printf("strcpy(backup,ziel)\n"); strcpy(backup,ziel); printf("Der Inhalt der Sicherungskopie :\n%s\n",backup); LINIE;
printf("Wir Vergleichen den Inhalt von 'backup' u. 'ziel'\n"); printf("ret=strcmp(backup,ziel)\n"); printf("Rückgabewerte: 0=gleich, 1=left>right, -1=left<right: "); ret=strcmp(backup,ziel); printf("%d\n",ret); LINIE;
return 0; }
|
Wir haben in diesem Beispiel strcat, strcpy und strcmp verwendet. Der Reihe nach..
strcat
strcat(ziel,".");
................
strcat(ziel,quelle);
Syntax:
char *strcat(char *ziel, const char *quelle)
Mit diesem Befehl wird eine Kopie der Zeichenkette 'quelle' an das Zeichenende von der Zeichenkette 'ziel' gesetzt. Vorrausgesetzt in der Zeichenkette 'ziel' ist genügend Platz vorhanden. Wenn sie z.B ein Feld haben...
char ziel[20] ={"Zu wenig Platzt"};
..und wollen jetzt folgendes ans Ende des Feldes hinzufügen....
strcat(ziel,"Ich habe leider keinen Platz in ziel! ");
...wird das nicht hinhauen da sie unserm String 'ziel' nur eine Feldgröße von 19 Zeichen gegeben haben und bereits mit 15 Zeichen beinhaltet ist.
strcpy
Syntax : char *strcpy(char *ziel, const char *quelle)
Hier wir der String von 'quelle' mit einschließlich des Null - Terminator '\0' in den String 'ziel' kopiert. Auch hier ist natürlich die Vorraussetzung das die Feldgröße des Zieles mindestens genauso groß ist wie die Feldgröße der Quelle.
strcmp
Syntax : int strcmp(const char *s1, const char *s2)
Diese Funktion ist nicht vom Typ char und gibt uns eine Rückgabewert vom Typ int zurück. Und zwar entweder 1, 0, oder -1 (siehe Tabelle). Beide Strings werden mindestens bis zum ersten Auftreten eines Null - Bytes miteinander verglichen.
s1>s2 |
Rückgabe:1 |
s1==s2 |
Rückgabe:0 |
s1<s2 |
Rückgabe:-1 |
Ich will hier nicht auf alle Funktionen eingehen sondern nur auf die etwas häufiger Eingesetzten. Dazu gehört auf alle Fälle :
strlen
/*Download:stringh2.c*/
#include <stdio.h> #include <string.h> #include <stdlib.h> #define LINE printf("-----------------------------------\n")
char stringzahlen[] ={"10 43 23 66 99"}; char text[] = {"Ich werde gezählt mit strlen()\n"}; char *zahlen;
int main() {
long temp,sum=0;
printf("Mit diesen Zahlen können wir noch nicht rechnen :\n"); printf("%s\n",stringzahlen); LINE;
printf("Wir änder die ersten beiden Zeichen in stringzahlen\n"); printf("um. Aus '10' soll '99' werden!!\n"); printf("(char*)memcpy(stringzahlen,"99",2)\n"); (char *)memcpy(stringzahlen,"99",2); printf("%s\n",stringzahlen); LINE;
printf("Jetzt wandeln wir die Zeichenkette 'stringzahlen' um\n"); printf("in echt long - Werte und wollen gleich die Summen\n"); printf("aller Zahlen ausrechnen.\n"); zahlen=stringzahlen; while(*zahlen) {
temp=strtol(zahlen,&zahlen,0); sum=sum+temp; } printf("Die Summe aller Zahlen lautet: %ld\n",sum); LINE;
printf("Die Anzahl der Zeichen in \n%s sind %d Zeichen\n",text,strlen(text)); LINE; printf("Zeichen in \n%s sind \n%d Zeichen\n",stringzahlen,strlen(stringzahlen));
return 0; }
|
memcpy
Zuerst wollen wir in unserem String die ersten beiden Zeichen '10' umändern in die Zeichen '99'. Ich sage bewusst Zeichen da es sich hier nicht um ein Zahlenfeld sondern um ein Feld von Typ char, also ein Zeichenfeld handelt. Das ändern erreichen wir mittels....
(char *)memcpy(stringzahlen,"99",2);
Bevor ich dazu genaueres Erläutere schauen sie sich den Syntax von 'memcpy' an....
void *memcpy(const void *ziel, const void *quelle, size_t groesse)
Da diese Funktion ein Zeigervom Typ 'void *' ist müssen wir diesen erst mal casten mit '(char *)'. Somit haben wir einen Zeiger auf die Funktion vom Typ 'char'. In den Klammern steht dann an erster Stelle das Ziel. Nach dem Komma steht dann die Quelle. In unserem Fall ist das Ziel : stringzahlen,die Quelle : "99". An letzter Stelle steht dann die Größe wie viel Bytes in das Ziel kopiert werden sollen. Hier sind es 2 Bytes. Unser String "99" hat 2 char - Werte und ein Zeichen hat die Größe von 1 Byte.
strtol
Dies ist kein Funktion von der Headerdatei <string.h
zahlen=stringzahlen;
while(*zahlen)
{
temp=strtol(zahlen,&zahlen,0);
sum=sum+temp;
}
Wir übergeben unsere Zeichenkette an dem Zeiger 'zahlen'. Der zeigt jetzt auf das erste Element im Feld 'stringzahlen' also auf das Zeichen 9. Jetzt geht in die while - Schleife. Nun wird mittels 'strtol(zahlen,&zahlen,0)' bis zum Ende der Zahl 99 gelesen. Da nach der Zahl 99 ein Leerzeichen steht und unsere Funktion 'strol' nur Zeichen von 0-9 in long - Werten umwandelt. bekommt unser Zeiger 'zahlen' mit '&zahlen' die Adresse von diesem Leerzeichen das unser Funktion nicht konvertieren konnte. Dann wir mit der Zahl noch
gerechnet. Unser Zeiger 'zahlen' in der while - Funktion zeigt jetzt auf das eben genannte Leerzeichen das wir ja unserem Zeiger mit Hilfe des Adressoperator übergeben haben (&zahlen). Nun geht es mit der nächsten Zahl weiter die 4 und dann die 3 und schließlich wieder ein Leerzeichen. Weiter
geht's dann wie gehabt, solange bis unser Adressoperator '&zahlen' unseren Terminatorstring '\0' beinhaltet und unsere while - Schleife somit abgebrochen wird.
strlen
Mit 'strlen' zählen wir die Anzahl der Zeichen vom Anfang der Zeichenkette mit zum Nullbyte '\0'. Das Nullbyte wird allerdings nicht mitgezählt. Hierdurch entfällt das umständliche Zählen einer Zeichenkette mit der for - Schleife.
Das war ein kleiner Überblick wie sie Funktionen der Headerdatei <string.h
![ein Kapitel weiter](../weiter.gif)
© 2001,2002 Jürgen Wolf
|