ein Kapitel zurück                                           ein Kapitel weiter

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 zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf