![]()  | 
            ![]()  | 
        |
    
 
 13.15.2 strchr() – ein Zeichen im String suchen 
      
 | 
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 
 Hinweis Dass die Funktion strlen() das Stringende-Zeichen '\0' nicht mitzählt, ist eine häufige Fehlerquelle, wenn es darum geht, dynamisch Speicher für einen String zu reservieren. Denken Sie daran, dass Sie immer Platz für ein Zeichen mehr bereithalten.  | 
Es ist die gleiche Funktion wie strcat(), nur dass hiermit n Zeichen angehängt werden. Die Syntax lautet:
char *strncat(char *s1, const char *s2, size_t n);
Diese Funktion ist aus Sicherheitsgründen der Funktion strcat() vorzuziehen. Ein Beispiel:
/* strncat.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 15
int main(void) {
   char string[MAX] = "Hallo ";
   char puffer[20];
   /* Vorhandenen Platz in string ermitteln */
   size_t len = MAX – strlen(string)+1;
   printf("Ihr Name: ");
   fgets(puffer, 20, stdin);
   strncat(string, puffer, len);
   printf("%s",string);
   return EXIT_SUCCESS;
}
Damit ist sichergestellt, dass nicht mehr in einen undefinierten Speicherbereich geschrieben wird.
| 
 Hinweis size_t ist ein primitiver Datentyp, der meistens als unsigned int oder unsigned long deklariert ist.  | 
Diese Funktion arbeitet genauso wie die Funktion strcmp(), nur mit dem Unterschied, dass n Zeichen miteinander verglichen werden. Die Syntax lautet:
int strncmp(const char *s1, const char *s2, size_t n);
Hiermit werden also die ersten n Zeichen von s1 und die ersten n Zeichen von s2 lexikographisch miteinander verglichen. Der Rückgabewert ist dabei derselbe wie schon bei strcmp(). Ein Beispiel:
/* strncmp.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
   char str1[] = "aaaa";
   char str2[] = "aabb";
   int i;
   for(i = strlen(str1); i > 0; i--) {
      if(strncmp( str1, str2, i) != 0)
         printf("Die ersten %d Zeichen der Strings "
                "sind nicht gleich\n",i);
         else {
            printf("Ab Zeichen %d sind "
                   "beide Strings gleich\n",i);
            /* Weiter vergleich sind nicht mehr nötig */
            break;
         }
   }
   return EXIT_SUCCESS;
}
Die sicherere Alternative zur Funktion strcpy() lautet strncpy(), welche n Zeichen kopiert. Der Ablauf der Funktion ist hingegen wieder derselbe wie bei strcpy(). Die Syntax lautet:
char *strncpy(char *s1, const char *s2, size_t n);
Hier werden n Zeichen aus dem String s2 in den String s1 ohne das '\0'-Zeichen kopiert. Das Beispiel:
/* strncpy.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20
int main(void) {
   char str1[MAX];
   char str2[] = "Ein Teststring welcher laenger"
                 " als 20 Zeichen ist";
   /* MAX-Zeichen in str1 kopieren */
   strncpy(str1, str2, MAX);
   /* Wichtig, String am Ende terminieren !! */
   str1[MAX] = '\0';
   printf("%s\n",str1);
   return EXIT_SUCCESS;
}
Diese Funktion arbeitet ähnlich wie strcspn(), nur dass hierbei nicht die Länge eines Teilstrings ermittelt wird, sondern das erste Auftreten eines Zeichens in einem String, welches im Suchstring enthalten ist. Die Syntax lautet:
char *strpbrk( const char *s1, const char *s2);
Ein Beispiel dazu:
/* strpbrk.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
   char str1[]="Das ist ein Teststring";
   char str2[]="ie";
   printf("%s\n",strpbrk(str1, str2));
   return EXIT_SUCCESS;
}
Diese Funktion ist der Funktion strchr() ähnlich, nur dass hierbei das erste Auftreten des Zeichens von hinten, genauer das letzte, ermittelt wird. Die Syntax lautet:
char *strrchr(const char *s, int ch);
Die Funktion fgets() hängt beim Einlesen eines Strings immer das Newline-Zeichen am Ende an. Manchmal ist das nicht erwünscht. Wir suchen mit strrchr() danach und überschreiben diese Position mit dem '\0'-Zeichen:
/* strrchr.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
   char string[20];
   char *ptr;
   printf("Eingabe machen: ");
   fgets(string, 20 , stdin);
   /* Zeiger auf die Adresse des Zeichens \n */
   ptr = strrchr(string, '\n');
   /* Zeichen mit \0 überschreiben */
   *ptr = '\0';
   printf("%s",string);
   return EXIT_SUCCESS;
}
Die Funktion strspn() gibt die Position des ersten Auftretens eines Zeichens an, das nicht vorkommt. Die Syntax lautet:
int strspn(const char *s1, const char *s2);
Ein Beispiel dazu:
/* strspn.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
   char string[] = "75301234–2123";
   int pos = strspn(string, "0123456789");
   printf("Position, welche keine Ziffer ist:");
   printf(" %d\n",pos); /* 8 */
   return EXIT_SUCCESS;
}
Dieses Beispiel liefert Ihnen die Position des Zeichens zurück, welches keine Ziffer ist.
Mit der Funktion strstr() können Sie einen String nach Auftreten eines Teilstrings durchsuchen. Die Syntax ist:
char *strstr(const char *s1, const char *s2);
Damit wird der String s1 nach einem String mit der Teilfolge s2 ohne '\0' durchsucht. Ein Beispiel:
/* strstr.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
   char string[] = "Das ist ein Teststring";
   char suchstring[] = "ein";
   if( strstr(string, suchstring) != NULL)
      printf("Suchstring \"%s\" gefunden\n", suchstring);
   return EXIT_SUCCESS;
}
Mit der Funktion strtok() können Sie einen String in einzelne Teilstrings anhand von Tokens zerlegen. Zuerst die Syntax:
char *strtok(char *s1, const char *s2);
Damit wird der String s1 durch das Token getrennt, welches sich im s2 befindet. Ein Token ist ein String, der keine Zeichen aus s2 enthält. Ein Beispiel:
/* strtok.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
   char string[] = "Ein Teststring mit mehreren Worten\n"
                   "und mehreren Zeilen.\t Ende\n";
   int i=1;
   char *ptr;
   ptr = strtok(string, "\n\t ");
   while(ptr != NULL) {
      printf("% d. Wort: %s\n",i++,ptr);
      ptr = strtok(NULL, "\n\t ");
   }
   return EXIT_SUCCESS;
}
Mit der Zeile
ptr = strtok(string, "\n\t ");
würde nur das erste Wort anhand eines der Whitspace-Zeichen Newline, Tabulator oder Space getrennt werden. Der String wird jetzt von der Funktion strtok() zwischengespeichert. Wollen Sie jetzt den String mit weiteren Aufrufen zerlegen, müssen Sie NULL verwenden.
ptr = strtok(NULL, "\n\t ");
Dabei gibt jeder Aufruf das Token zurück. Das jeweilige Trennzeichen wird dabei mit '\0' überschrieben. In diesem Beispiel ist die Schleife am Ende, wenn strtok() den NULL-Zeiger zurückliefert.
Allmählich ist es an der Zeit, dass Sie lernen, mit Zeigern zu arbeiten.
| 
 Hinweis In der Headerdatei <string.h> sind noch weitere Funktionen deklariert, auf die im Verlauf des Buchs noch eingegangen wird.  | 
| << zurück | 
                
  | 
        ||||||||||||||
                
  | 
        ||||||||||||||
                
  | 
        ||||||||||||||
                
  | 
        ||||||||||||||
Copyright © Galileo Press 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.