:CPP: String-VerarbeitungStrings 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.
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 -> |
|
Das '\0' Zeichen am Ende des Strings dient als Ende-Markierung (Erbe aus C). |
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
Aufgabe: 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" |
cout << s.length(); // gibt die Länge zurück
Aufgabe: Erweitern Sie Ihr Programm um die Ausgabe der String-Länge, Beispiel:
| Ausgabe | "Hallo_Hugo, Laenge 10" | Achtung: string + int führt zu Fehlermeldung! |
|---|
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
Aufgabe: Schreiben Sie ein Programm, das nach Eingabe eines Strings s die einzelnen Buchstaben des Strings mit Leerzeichen getrennt wieder ausgibt. Beispiel:
|
Tipp zur Ausgabe: cout << s[n] << " |
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. |
|
||||||||||||||||||||||||
Problem: Ein eingegebener String soll in seine einzelnen Wörter zerlegt werden, als Trennzeichen dient '_'. Beispiel:
Analyse
|
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' |
Aufgabe: Entwerfen Sie ein Verfahren, mit dem die Wörter untereinander ausgegeben werden können.
Aufgabe: Implementieren Sie Ihre Lösung und testen Sie sie!
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" |