20.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 vorenthalten. Mit den mem...-Funktionen in der Headerdatei <string.h> können Sie ganze Speicherblöcke kopieren, vergleichen, initialisieren und durchsuchen.
20.8.1 »memchr()« – Suche nach einzelnen Zeichen 

Die Syntax lautet:
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; }
20.8.2 »memcmp()« – bestimmte Anzahl von Bytes vergleichen 

Die Syntax lautet:
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 lexikografisch 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; }
20.8.3 »memcpy()« – bestimmte Anzahl von Bytes kopieren 

Die Syntax lautet:
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, das 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; }
20.8.4 »memmove()« – bestimmte Anzahl von Bytes kopieren 

Die Syntax lautet:
void *memmove(void *dest, const void* src, size_t n);
Die Funktion erfüllt denselben Zweck wie die Funktion memcpy() – 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; }
20.8.5 »memset()« – Speicherbereich mit bestimmten Zeichen auffüllen 

Die Syntax lautet:
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; }
Hinweis |
Der Zugriff auf Speicherblöcke mit den mem...()-Funktionen in der Headerdatei <string.h> erfolgt byteweise und ist somit nicht für Breitzeichen geeignet. Für Breitzeichen sind in der Headerdatei <wchar.h> die Gegenstücke wmemcpy(), wmemmove(), wmemcmp(), wmemchr() und wmemset() definiert. Anders als bei der Größe eines Speicherblocks (immer der dritte Parameter), die als Anzahl von Bytes eingegeben wird, muss hier allerdings die Anzahl der Breitzeichen eingegeben werden. |
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.