MezData-Logo

String-Verarbeitung

Strings sind Zeichenketten, Es gibt verschiedene Implementierungen für Zeichenketten:

Klassisch: C Moderner: C++ Kompatibel: mit Delphi / Pascal
char-Array string-Klasse AnsiString-Klasse entspricht
String-Datentyp aus Delphi
SmallString<n> entspricht
String[n] aus Delphi
char s[] = "Hugo" string s = "Hugo" String s = "Hugo" SmallString<40> s = "Hugo"
Strings beginnen mit dem Index 0 Strings beginnen mit dem Index 1 wie bei Pascal üblich

Wir werden später die AnsiStrings kennenlernen, diese werden bei der VCL (graphische Oberflächen) verwendet.

Hier soll auf die Verarbeitung mit der "string-Klasse" eingegangen werden, um die Grundprinzipien zu verdeutlichen.

Verarbeitung mit der string-Klasse

Anlegen eines "string-Objekts"

string s;   // Definition eines string-Objektzeigers
s = "Hugo"; // Zuweisung eines string-Objekts an s

s zeigt nun auf ein string-Objekt mit dem Inhalt "Hugo", d.h. in s steht die Speicheradresse des Objekts.

s ->
Verwaltungs-
Information
'H' 'u' 'g' 'o' '\0'
Das '\0' Zeichen am Ende des Strings dient als Ende-Markierung (Erbe aus C).

Verbinden von Strings (Addition)

Der Additions-Operaror '+' bewirkt bei Strings ein Aneinanderhängen:

s = "Hugo";
s = s + " lacht"; // hinten erweitern 
cout << s;        // Ausgabe: Hugo lacht
s = "Der " + s;   // vorne erweitern
cout << s;        // Ausgabe: Der Hugo lacht

Entwickeln Sie ein Programm, das nach Eingabe zweier Strings s1,s2, diese mit '_' verbunden wieder ausgibt, Beispiel:

Eingabe cin >> s1; Hallo
Eingabe cin >> s2; Hugo
Ausgabe cout << s; "Hallo_Hugo"

Länge des Strings bestimmen

cout << s.length(); // gibt die Länge zurück

Erweitern Sie Ihr Programm um die Ausgabe der String-Länge, Beispiel:

Ausgabe "Hallo_Hugo, Laenge 10" Achtung: string + int führt zu Fehlermeldung!

Zugriff auf einzelne Zeichen

Auf die einzelnen Zeichen (char von character = Schriftzeichen) kann wie bei einem Array zugegriffen werden, das erste Zeichen hat den Index 0:

s = "Hugo";
cout << s[0]; // gibt 'H' aus
s[0] = 'L';   // das erste Zeichen durch ein 'L' ersetzen
cout << s;    // gibt "Lugo" aus

Unterschied zwischen " und ' : "H" ist eine Zeichenkette mit dem Zeichen 'H', 'H' ein einzelnes Zeichen

Schreiben Sie ein Programm, das nach Eingabe eines Strings s die einzelnen Buchstaben des Strings mit Leerzeichen getrennt wieder ausgibt. Beispiel:

Eingabe Hugo
Ausgabe "H u g o"

Tipp zur Ausgabe:

cout << s[n] << "
Erweitern Sie Ihr Programm um die Ausgabe der Zeichen als Integer-Wert in der nächsten Zeile. Tipp:
cout << (int) s[n] << " "; // Umwandeln in Zahl, mit Type-Cast

Suchen Sie die ASCII-Tabelle in Ihrem Tabellenbuch z.B. S105 und vergleichen Sie die Ausgabe Ihres Programms mit der ASCII-Tabelle.

string-Objekt "Hugo"
Zeichen s[0| s[1] s[2] s[3] s[4]
als char 'H' 'u' 'g' 'o' '\0'
als int 72 117 103 111 0

Zerlegen in Teil-Strings

Problem: Ein eingegebener String soll in seine einzelnen Wörter zerlegt werden, als Trennzeichen dient '_'. Beispiel:

Eingabe "Der_Hugo_lacht"
Ausgabe "Der"
Ausgabe "H u g o"
Ausgabe "lacht"

Analyse

Womit lässt sich jedes Wort in einer neuen Zeile ausgeben?

Hinweis: Wenn als Trennzeichen das Leerzeichen (Space) verwendet wird, übernimmt cin nur die Zeichenfolge bis zum Leerzeichen.

Deshalb verwenden wir hier das '_' als Trennzeichen.

Folgender "Work around" hat ein Schüler zur Umgehung des Problems gefunden:

string s;
char c;
do{
  c = (char) cin.get();
  s += c;
}while (c != '\n');
String s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7] s[8] s[9] s[10] s[11] s[12] s[13] s[14]
Inhalt 'D' 'e' 'r' '_' 'H' 'u' 'g' 'o' '_' 'l' 'a' 'c' 'h' 't' '\0'

Design

Aufgabe: Entwerfen Sie ein Verfahren, mit dem die Wörter untereinander ausgegeben werden können.

Programmierung / Implementierung / Test

Implementieren Sie Ihre Lösung und testen Sie sie!

Dokumentation

Aufgabe: Erstellen Sie ein Struktogramm für Ihre Lösung.

Zusatz-Aufgabe: Entwickeln Sie eine Lösung, bei der die einzelnen Wörter in separaten Strings abgespeichert werden:

Eingabe s= "Der_Hugo_lacht"
s1 = "Der"
s2 = "H u g o"
s3 = "lacht"
Lösung anzeigen..