22.8 <string.h> – Die mem…-Funktionen zur Speichermanipulation
Die meisten Stringfunktionen wurden bereits an früherer Stelle behandelt. Aber einige Funktionen habe ich Ihnen bislang noch unterschlagen. Mit den mem...-Funktionen in der Headerdatei <string.h> können Sie ganze Speicherblöcke kopieren, vergleichen, initialisieren und durchsuchen.
22.8.1 memchr() – Suche nach einzelnen Zeichen
Die Syntax:
void *memchr(const void *buffer, int c, size_t n);
Diese Funktion sucht in den ersten n Bytes in buffer nach dem Zeichen c. Sollten Sie den ganzen String durchsuchen wollen, können Sie die Funktion strchr() verwenden. Tritt dabei ein Fehler auf oder wird das Zeichen nicht gefunden, gibt diese NULL zurück. Ein Beispiel:
/* memchr.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
char str[] = "Have a lot of fun";
char *p;
char ch = 'l';
p = (char *) memchr(str, ch, 10);
if(NULL == p)
printf("%c kommt nicht in den ersten 10 Bytes vor\n", ch);
else
printf("%c gefunden an Pos. %d\n", ch, p-str);
return EXIT_SUCCESS;
}
22.8.2 memcmp() – Bestimmte Anzahl von Bytes vergleichen
Die Syntax:
int memcmp( const void *s1, const void *s2, size_t n);
Mit memcmp() werden die ersten n Bytes im Puffer s1 mit dem Puffer s2 lexografisch verglichen. Der Rückgabewert ist derselbe wie schon bei strcmp(). Ist s1 größer als s2, ist der Rückgabewert kleiner als 0. Ist s2 größer als s1, ist die Rückgabe größer als 0, und bei Gleichheit beider Speicherbereiche wird 0 zurückgegeben.
/* memcmp.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
char str1[] = "Have a lot of fun";
char str2[] = "Have more than a lot of fun";
int check, i;
for(i = 4; i <= 10; i+=6) {
check = memcmp( str1, str2, i);
if(check == 0)
printf("Vergleich %d Bytes: "
"Beide Strings sind gleich\n", i);
else
printf("Die ersten %d Bytes sind "
"unterschiedlich\n", i);
}
return EXIT_SUCCESS;
}
22.8.3 memcpy() – Bestimmte Anzahl von Bytes kopieren
Die Syntax:
void *memcpy(void *dest, const void *src, size_t n);
Mit der Funktion memcpy() können Sie n Bytes aus dem Puffer src in den Puffer dest kopieren. Die Funktion gibt die Anfangsadresse von dest zurück.
/* memcpy.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
char str[] = "Ein Wort was hier nicht hingehört: Mist!";
char replace[] = "M***";
char *ptr;
ptr = strstr(str, "Mist");
memcpy(ptr, replace, strlen(replace));
printf("%s\n",str);
return EXIT_SUCCESS;
}
22.8.4 memmove() – Bestimmte Anzahl von Bytes kopieren
Die Syntax:
void *memmove(void *dest, const void* src, size_t n);
Die Funktion erfüllt denselben Zweck wie die Funktion memcp(), mit einem einzigen, aber gravierenden Unterschied. memmove() stellt sicher, dass im Fall einer Überlappung der Speicherbereiche der Überlappungsbereich zuerst gelesen und dann überschrieben wird. Auch die Rückgabewerte sind bei memmove() dieselben wie bei memcpy().
/* memmove.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
char str[21] = "1234567890";
/* Den kompletten String nehmen und
* 10 Bytes weiter als Kopie ablegen */
memmove(str+10, str, sizeof(str)-1);
printf("%s\n",str);
return EXIT_SUCCESS;
}
22.8.5 memset() – Speicherbereich mit bestimmten Zeichen auffüllen
Die Syntax:
void *memset(void *dest, int ch, unsigned int n);
Mit dieser Funktion füllen Sie die ersten n Bytes der Adresse dest mit den Zeichen ch auf.
/* memset.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
char credit_card[21] = "123456-aiex";
char *ptr = strchr(credit_card, '-');
*ptr++;
/* Die letzten vier Zeichen der Kreditkartennummer
* nicht angeben */
memset(ptr, '*', 4);
printf("%s\n",credit_card);
return EXIT_SUCCESS;
}
|