[Inhalt][0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17]
Teil 11 : Bibliotheken - Stringverarbeitung I
 
Was macht man mit eingelesenen Zeichenketten ? Neben den einfachen Zuweisungen und Abfragen gibt es eine Reihe von komplexen Befehlen, die es einem ermöglichen mit Zeichenketten effizient zu arbeiten.

 
<string.h>

Bei den folgenden Befehlen muß die Headerdatei <string.h> durch ein
 

#include <string.h>

eingebunden werden! In den Beispielen gelten folgende Variablenvereinbarungen:
 

char *a; 
char *b; 
char c; 

int n; 
int m;


 
strcat ( char *a , char *b )

Es wird an a die Zeichenfolge von b angehängt.
 

#include <stdio.h>
#include <string.h>

void main (void)
{

char *a = "C-Kurs "; 
char *b = "bei AOL"; 

printf ("\na = %s\nb = %s\n",a,b); 
/* 

b wird an das Ende von a gehängt
*/ 
strcat ( a, b ); 
printf("\na = %s\n",a);
}

Das Beispiel gibt erst die Einzelnentrings aus und danach den neuen String a. Das fertige Programm liefert also:

Screenshot des ausgeführten Programms


strncat ( char *a , char *b , int n )

Es wird wie bei strcat b an a angehängt. Jedoch nur maximal n Zeichen von b werden angehängt..
 

#include <stdio.h>
#include <string.h>

void main (void)
{

char *a = "C-Kurs "; 
char *b = "bei AOL macht Spasz"; 
int n = 7; 

printf ("\na = %s\nb = %s\n",a,b); 

/* 

b wird an das Ende von a gehängt 
Jedoch nur maximal n=7 Zeichen von b
*/ 
strncat ( a, b ); 
printf("\na = %s\n",a);
}

Nachdem wir das Programm starten, erhalten wir

Screenshot des ausgeführten Programms


int m = strcmp ( char *a , char *b )

Die beiden Zeichenketten werden miteinander verglichen.Dabei werden von links beginnend alle Zeichen miteinander verglichen und bei den ersten Zeichen die ungleich sind entscheided, welches Zeichen größer ist und somit welcher Wert als Ergebnis nach m zurückgegeben wird. Im einzelnen sind das...
 

a < b -1 oder eine 
negative Zahl
a = b
0
a > b 1 oder eine 
positive Zahl
 

In einem Programm sieht das dann so aus:
 

#include <stdio.h>
#include <string.h>

void main (void)
{

char *a = "C-Kurs 1"; 
char *b = "C-Kurs 2"; 

/* 

Es werden beide Strings 
miteinander verglichen
*/ 
printf ("\na = %s",a);
printf ("\nb = %s\n\n",b);
printf ("\nstrcmp (a,b) = %d\n", strcmp (a,b) ); 
printf ("\nstrcmp (a,a) = %d\n", strcmp (a,a) ); 
printf ("\nstrcmp (b,a) = %d\n", strcmp (b,a) ); 
}

Das Ergebnis beim starten des Programms sieht wie folgt aus:

Screenshot des ausgeführten Programms

Nach der Eingangserläuterung kann man sich denken, das die Länge nichts mit dem Ergebnis zu tun hat. Um das zu überprüfen geben wir folgende Strings ein und sehen, das dem tatsächlich so ist.

Screenshot des ausgeführten Programms


int m = strncmp ( char *a , char *b , int n )

Die Funktion ist fast die selbe wie strcmp mit dem Unterschied, das nur die ersten n Zeichen verglichen werden. Alle nachfolgenden Zeichen werden ignoriert. Die Ergebnisse sind wie bei strcmp(..) .
 

#include <stdio.h>
#include <string.h>

void main (void)
{

char *a = "Bascht"; 
char *b = "Basstrompeter"; 

/* 

Es werden beide Strings 
miteinander verglichen
*/ 
printf ("\na = %s",a);
printf ("\nb = %s\n\n",b);
printf ("\nstrncmp (a,b,3) = %d\n", strncmp (a,b,3) ); 
printf ("\nstrncmp (a,a,3) = %d\n", strncmp (a,a,3) ); 
printf ("\nstrncmp (b,a,3) = %d\n", strncmp (b,a,3) ); 
}

Screenshot des ausgeführten Programms


strcpy ( char *a , char *b )

Der Inhalt von b wird nach a kopiert. Das Beispielprogramm....
 

#include <stdio.h>
#include <string.h>

void main (void)
{

char *a = "Der deutsche "; 
char *b = "AOL C-Kurs";

printf ("\n%s",a); 

/* jetzt wird b in a kopiert */
strcpy (a,b); 
printf ("%s\n",a);

}

...gibt folgendes aus

Screenshot des ausgeführten Programms



 
 
 
 
 
strncpy ( char *a , char *b , int n )

Es werden höchstens n Zeichen von b nach a kopiert.Der Rest des Strings bleibt erhalten.
 

#include <stdio.h>
#include <string.h>

void main (void)
{

char *a = "Der deutsche "; 
char *b = "AOL C-Kurs"; 
int n = 3; 

strncpy (b,a,n); 
printf ("%s\n",b);

}

...gibt folgendes aus

Screenshot des ausgeführten Programms

Wenden wir das an , was wir über positionierung von Zeigern lernten, so kann man Textstellen beliebig plaziert in andere Strings schreiben, wie das folgende Beispiel zeigt.
 

#include <stdio.h>
#include <string.h>

void main (void)
{

char *a = "An sich sind Hunde schoene Tiere"; 
char *b = "Kurse"; 
 
/* wir kopieren 5 Buchstaben */
int n = 5; 

/* an x-te Stelle, hier x=13 */
int x = 13;

strncpy ( a+x, b, n); 
printf ("%s\n",a);

}

..und haben somit die 5 Buchstaben von 13.ter Stelle ab in a ersetzt durch die in b stehenden und haben folgendes Erhalten.

Screenshot des ausgeführten Programms


int n = strlen ( char *a )

Es wird die Länge der Zeichenkette ( ohne /0 ) nach n zurückgegeben ( s. dazu auch Teil 1 )
 

#include <stdio.h>
#include <string.h>

void main (void)
{

char *a ="C macht Spasz"; 
int n; 

n = strlen (a); 
printf ("\na ist %d Zeichen lang\n",n);

}

Als Ergebnis erhalten wir nach dem Programmstart

Screenshot des ausgeführten Programms


char *b = strchr ( char *a , char c )

Es wird String a nach dem Buchstaben c durchsucht und ein Zeiger auf die Stelle in a nach b zurückgegeben, an der sich der Buchstabe c zuerst befindet. Existiert kein Buchstabe, so wird ein NULL zurückgegeben.
 

#include <stdio.h>
#include <string.h>

void main (void)
{

char *a ="C macht Spasz"; 

printf ("%s" , strchr (a , 'S') );

}

gibt folgendes aus

Screenshot des ausgeführten Programms

Es wird also alles ab dem ersten 'S' ausgegeben.
 
 
char *b = strrchr ( char *a , char c )

Es wird String a nach dem Buchstaben c durchsucht und ein Zeiger auf die Stelle in a nach b zurückgegeben, an der sich der Buchstabe c zuletzt befindet. Existiert kein Buchstabe, so wird ein NULL zurückgegeben. Folgendes Beispielprogramm
 

#include <stdio.h>
#include <string.h>

void main (void)
{

char *a ="C macht Spasz, riesig Spasz"; 

printf ("%s" , strrchr (a , 'S') );

}

gibt folgendes aus

Screenshot des ausgeführten Programms

Es wird hier alles nach dem letzten 'S' ausgegeben.
 
 
 
...das Obligatorische

Autor: Sebastian Cyris PCDBascht@aol.com

Dieser C-Kurs dient nur zu Lehrzwecken! Eine Vervielfältigung ist ohne vorherige Absprache mit dem Autor verboten! Die verwendete Software unterliegt der GPL und unterliegt der Software beiliegenden Bestimmungen zu deren Nutzung! Jede weitere Lizenzbestimmung die der benutzten Software beiliegt, ist zu beachten!