ein Kapitel zurück                                           ein Kapitel weiter

Strings sind eigentlich nichts anderes als Arrays vom Typ char und dienen zur Darstellung und Verarbeitung von Zeichenfolgen (String). Gemeint sind damit Programmierung von Benutzerschnittstellen und Verarbeitung von Textdateien. Stringkonstanten haben sie schon kennen gelernt in Form von z.B...

printf("Ich bin die Stringkonstante und stehe zwischen 2 Hochkommata");

Alles was zwischen 2 Hochkommata steht ist eine Stringkonstante. Darstellen können wir Stringkonstanten auf 2 verschieden Arten.....

char hallo1[] = {"Hallo Welt\n"};

...oder...

char hallo2[]={'H','a','l','l','o','W','e','l','t','\n','\0'};

Wenn sie den Inhalt des Arrays direkt bei der Deklaration übergeben, benötigen sie keinen Indexwert '[]'. Beide Variationen oben sind gleichwertig. Sehen wir uns mal die interne Darstellung unserer Zeichenkette an.....





Sie sehen wir benötigen für unsere Zeichenkette 12 Felder. Wenn sie jetzt unseren ersten String 'hallo1[]' ansehen werden sie sich fragen, warum 12 Zeichen und nicht wie dargestellt 11? Bei Strings benötigen wir eine Art Terminator der uns das Ende der Zeichenkette anzeigt. Und das ist das Zeichen '\0'. Also merken sie sich gleich wenn sie einen String eine Zeichenkette mit 10 Zeichen übergeben in unserem Indexfeld [] den Wert 11 reinzuschreiben da wir immer einen String für unser Schlusszeichen '\0' benötigen. Beispiel....

/*Download:string1.c*/
#include <stdio.h>

char hello1[] = {"Hallo Welt\n"};
char output[] = {"Ich bin lesbar \0 Ich nicht mehr"};
char deznul[] = {"Mich siehst du 0 Mich und die Null auch"};

int main()
{
printf("%s",hello1);
printf("%s\n",output);
printf("%s",deznul);
return 0;
}

Hier sehen sie wie sie unsere Zeichenketten auf dem Bildschirm ausgeben. Neu ist dabei das Formatzeichen '%s'. Wobei das s für String (Zeichen) steht. Jetzt könne sie verstehen warum ein String ein Ende-Kennungszeichen benötigt. Denn anstatt wie bei unseren Arrays mit Zahlen, wo sie mit Schleifen oder Indexfelder auf die einzelnen Werte zugreifen müssen, wird unser String auf eine Schlag ausgegeben und muss dabei auch wissen wann Schluss ist. Bei unserm String...

char output[] = {"Ich bin lesbar \0 Ich nicht mehr"};

...werden nur die Zeichen bis '\0' ausgegeben. Die zweite Hälfte existiert zwar aber wird niemals ausgegeben, da zuvor unser Zeichen für das Ende des Strings '\0' steht. Im nächsten Beispiel ....

char deznul[] = {"Mich siehst du 0 Mich und die Null auch"};

...wird der ganze String ausgegeben, weil das Zeichen '0' nicht gleich mit dem Zeichen '\0' ist. So ich glaube das dürften sie jetzt verstanden haben. Natürlich ist es auch möglich auf die einzelnen Zeichen mit dem Indexfeld zuzugreifen. Was natürlich auch ein weiter Vorteil der Strings ist wenn wir die Strings auf Ihre Länge überprüfen wollen mit einer for - Schleife zum Beispiel benötigen wir lediglich als Abbruchbedienung das unser Zeichen '\0'. Hier ein weiteres Beispiel....

/*Download:string2.c*/
#include <stdio.h>

char hello1[] = {"Hallo Welt"};
char output[] = {"Ich bin lesbar \0 Ich nicht mehr"};
char deznul[] = {"Mich siehst du 0 Mich und die Null auch"};

int main()
{
int i;

printf("%c",output[0]); /*I*/
printf("%c'",hello1[9]); /*t*/
printf("%c ",deznul[5]); /*s*/
printf("%c",hello1[7]); /*Gibt das Zeichen 'e' aus*/
printf("%c",output[12]); /*a*/
printf("%c",deznul[5]); /*s*/

deznul[1]='y'; /*aus 'i' wird 'y'*/
printf("%c\n",deznul[1]); /*y*/

for(i=0; hello1[i]!='\0'; i++);
printf("Länge von '%s' = %d Zeichen\n",hello1,i);

for(i=0; output[i]!='\0'; i++);
printf("Länge von '%s' = %d Zeichen\n",output,i);

for(i=0; deznul[i]!='\0'; i++);
printf("Länge von '%s' = %d Zeichen\n",deznul,i);

return 0;
}

Wir sehen das es auch möglich ist mit dem Feldindex die einzelnen Elemente auszugeben. In unserem Fall wird der Text 'It's easy' ausgegeben. Auch ist es natürlich möglich den Inhalt zu verändern wie wir es mit...

deznul[1]='y';

...gemacht haben. Anschließend zählen wir mittels...

for(i=0; hello1[i]!='\0'; i++);

....die Anzahl der Zeichen in unserem String 'hello1[]' ohne dem Zeichen '\0' natürlich. Und dies wird wie ich finde sehr einfach gelöst. Ohne die die Gefahr das uns irgendetwas wegläuft denn die Abbruchbedienung...

hello1[i]!='\0'

..ist solange wahr bis der Inhalt von 'hello1[i]' '\0' ist. In unserem Fall wäre 'hello1[11]' da es das Zeichen '\0' beinhaltet der Abbruch. Bitte beachten sie auch das hinter unserer for - Schleife ein Semikolon steht. Es gibt keinen Anweisungsblock, hier die Variable 'i' solange hochgezählt bis eben dem Zeichen '\0'. Bei den anderen beiden Strings läuft es genauso ab. Jetzt wollen wir uns mal ein Beispiel ansehen zur Bearbeitung von Texten. Es soll unsere Zeichenkette durchlaufen und alle 'und' in Großbuchstaben umwandeln und ausgeben....

/*Download:string3.c*/
#include <stdio.h>

char undbig[] = {"Dieser Programm soll alle Wörter Namens\n"
"'und'\n"
"Großschreiben und anschließend den gesamten\n"
"String ausgeben mit Großen 'und' ausgeben\n"
"Schauen sie sich den Buchstaben 'u' mal auf\n"
"der ASCII-Code Tabelle an und es wird Ihnen\n"
"auffallen das der kleine Buchstabe 'u'\n"
"den Dezimalen Wert von 117 hat und das grosse\n"
"'U' den Wert 85.Und was sagt uns das?\n"
"Betrachten wir den Buchstaben 'v'. Und den\n"
"Großbuchstaben 'V'. v=dezimal 118 und V=86\n"
"Folglich ist die Differenz zwischen den\n"
"Grossen und Kleine Buchstaben von A-Z und von\n"
"a-z immer 32. Und was sagt uns das? Wenn wir z.B."
"\ndas kleine 'u' ins Große umwandeln wollen\n"
"brauchen wir lediglich das 'u' mit 32 Subtrahieren\n"
"und wir haben den Großbuchstaben darür\n"
"Dies gilt für alle 26 Buchstaben!!!!!\n" };


int main()
{
int i;

for(i=0; undbig[i]!='\0'; i++)
{
if(undbig[i]=='u' || undbig[i]=='U')
{
if(undbig[i+1]=='n' && undbig[i+2]=='d')
{
undbig[i]='U';
undbig[i+1]- =32;
undbig[i+2]- =32;
}
}
}
printf("%s",undbig);
return 0;
}

Zu Beginn des Programms sehen sie wie sie Zeichenketten eines Arrays über mehrere Zeilen schreiben können. Hier sehen sehen sie auch das es noch eine andere Möglichkeit gibt längere Arrays zu schreiben....

char blubb[] = {"hahahahahahahahaha"
                        "hihihihihihihihihi"};




char blubb[] = {"hahahahahahahahaha\
                         hihihihihihihihihi"};


Beide Schreibweisen erfüllen den selben Zweck. Zurück zum Programm. In unserer ersten for - Schleife....

for(i=0; undbig[i]!='\0'; i++)

...durchlaufen wir unseren String Zeichenweise bis bis wir auf das '\0' - Zeichen stoßen. Bei unsere nächsten Anweisung...

if(undbig[i]=='u' || undbig[i]=='U')

...überprüfen wir ob unsere Zeichen bei dem wir gerade sind ein kleines oder großes 'u..U' ist. Falls nicht wird i in unserer for-Schleife um den Wert 1 erhöht. Falls wir aber auf ein 'u..U' gestoßen sind überprüfen wir mit....

if(undbig[i+1]=='n' && undbig[i+2]=='d')

..die nächsten beiden Buchstaben ob sie 'n' UND 'd' repräsentieren. Wenn es 'n' und 'd' sind haben wir ein 'und' gefunden. Nun können wir mit....

undbig[i]='U';
undbig[i+1]-=32;
undbig[i+2]-=32;


...aus 'und' oder 'Und' -

'n'-32 und 'd'-32

Wenn sie nicht wissen wieso, dann schauen sie sich die ASCII-Tabellen an. Schauen sie welchen Dezimalwert die Zeichen 'n' und 'd' haben. Umgeschrieben sieht das jetzt so aus...

110-32 und 100-32

Als Ergebnis dieser Subtraktion erhalten sie die beiden Werte : 78 und 68. Jetzt schauen sie nochmals auf die ASCII-Tabelle welche Zeichen diese beiden Dezimalwerte repräsentieren. Richtig das große 'N' und das große 'D'. Dies können sie mit allen 26 Buchstaben unseres Alphabetes machen. Wollen sie z.B. das große 'A' in ein kleines verwandeln brauchen sie nur die 32 dazuaddieren und wir haben den Dezimalwert 98 der das kleine 'a' ist. Das Programm gibt übrigens alle 'und' in Großbuchstaben aus also aus...

Grund

...wird...

GrUND

Sie können das ja wenn sie wollen beheben. Sie müssen nur überprüfen ob vor dem 'u' und nach dem 'd' ein Leerzeichen ist. Dies gilt aber nicht nicht für Sonderzeichen und deutschen Umlauten wie 'äöüß'. Diese müssen sie einer extra Überprüfung unterziehen. Was passiert wenn man zuviel Speicher für das Zeichen-Array reserviert hat wie z.B...

char zeichen[14] = "Hallo Welt\n";

Die restlichen Elemente werden mit \0 initialisiert....



Aufgabe
Schreiben sie ein Programm wie oben den folgenden Text in Grossbuchstaben ausgibt. Benutzen sie keine Headerdatai außer <stdio.h

Diese Zeichenkette soll in Grossbuchstaben ausgegeben werden. Ohne Verwendung der Header datei '#include <ctype.h

Hier geht's zur Lösung!

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf