====== Datentyp string in C++ ====== In C++ wird der Datentyp **string** verwendet, um Zeichenketten zu speichern und zu verarbeiten. Anders als der C-String (ein Array von ''char''-Elementen mit Null-Terminierung) ist der ''string''-Typ eine komfortable Klasse aus der **Standardbibliothek** (''''), die viele nützliche Funktionen zur Bearbeitung von Zeichenketten bietet. ===== Deklaration und Initialisierung ===== Ein ''string'' kann folgendermaßen deklariert und initialisiert werden: #include #include // Notwendig für string using namespace std; int main() { string text = "Hallo, Welt!"; cout << text << endl; return 0; } ===== Wichtige Methoden von string ===== * ''string text = "Das ist ein Text"''; * ''getline(cin, text)'': Eingabe eines Textes inkl. Leerzeichen * ''text.length()'' oder ''size()'': Gibt die Anzahl der Zeichen zurück. * ''text.append(string)'': Fügt eine Zeichenkette an. * ''text.insert(pos, string)'': Fügt eine Zeichenkette an einer bestimmten Position ein. * ''text.erase(pos, len)'': Entfernt len Zeichen aus der Zeichenkette an der Position pos. * ''text.substr(pos, len)'': Gibt einen Teil der Zeichenkette zurück. * ''text.find(string)'': Sucht nach einem Teilstring und gibt die Position zurück. * ''text[i]'' liefert das Zeichen an der i. Stelle ====== Range-basierte for-Schleife in C++ ====== Die range-basierte for-Schleife ist eine moderne und vereinfachte Form der Schleife in C++, mit der man alle Elemente einer Sammlung (z. B. ''string'', ''vector'', Array) bequem durchlaufen kann – ganz ohne Zählvariable. ===== Syntax ===== for (Datentyp variable : sammlung) { // Anweisungen } * ''Datentyp'' ist der Typ eines einzelnen Elements (z. B. ''char'', ''int'' oder ''auto'') * ''variable'' ist der Platzhalter für das aktuelle Element * ''sammlung'' ist z. B. ein ''std::string'', ''std::vector'', Array usw. ===== Beispiel mit string ===== #include #include using namespace std; int main() { string text = "Hallo"; for (char c : text) { cout << c << endl; } return 0; } **Ausgabe:** H a l l o ===== Vorteile ===== * Einfach zu schreiben * Keine Zählvariable oder Index notwendig * Weniger Fehleranfällig (kein ''i++'', ''i < size()'' usw.) * Ideal zum Durchlaufen von Zeichenketten, Arrays, Vektoren etc. ===== Hinweis zur Referenz ===== Wenn man die Elemente **verändern** möchte, muss man mit **Referenz** arbeiten: vector zahlen = {1, 2, 3}; for (int& z : zahlen) { z = z * 2; } Ohne das ''&'' (Referenz) wird nur eine Kopie des Wertes verändert – nicht das Original. ===== Einschränkungen ===== * Kein direkter Zugriff auf den Index * Nicht geeignet, wenn man z. B. das vorige oder nächste Element braucht ===== Fazit ===== Die range-basierte for-Schleife ist ideal, wenn man alle Elemente einer Sammlung **durchlaufen**, aber **keinen Index** braucht. Sie ist übersichtlich, kompakt und sicher. ===== Weitere nützliche Methoden von string ===== * ''text.push_back(char)'': Fügt ein einzelnes Zeichen am Ende der Zeichenkette an. * Beispiel: ''text.push_back('a');'' fügt das Zeichen 'a' am Ende der Zeichenkette hinzu. * ''text.pop_back()'': Entfernt das letzte Zeichen aus der Zeichenkette. * Beispiel: ''text.pop_back();'' entfernt das letzte Zeichen der Zeichenkette. * ''text.empty()'': Gibt zurück, ob die Zeichenkette leer ist (true, wenn sie leer ist, sonst false). * Beispiel: ''if (text.empty()) { cout << "Die Zeichenkette ist leer."; }'' * ''text.replace(pos, len, string)'': Ersetzt einen Teil der Zeichenkette von Position ''pos'' mit einer neuen Zeichenkette. * Beispiel: ''text.replace(3, 4, "neuerText");'' ersetzt 4 Zeichen ab der Position 3 durch "neuerText". * ''text.erase(pos)'': Entfernt alle Zeichen ab der Position ''pos'' bis zum Ende der Zeichenkette. * Beispiel: ''text.erase(5);'' entfernt alle Zeichen ab der Position 5 bis zum Ende der Zeichenkette. * ''text.find_first_of(string)'': Sucht nach dem ersten Vorkommen eines beliebigen Zeichens aus einer gegebenen Zeichenkette und gibt dessen Position zurück. * Beispiel: ''size_t pos = text.find_first_of("aeiou");'' sucht nach dem ersten Vokal in der Zeichenkette und gibt dessen Position zurück. * ''text.find_last_of(string)'': Sucht nach dem letzten Vorkommen eines beliebigen Zeichens aus einer gegebenen Zeichenkette und gibt dessen Position zurück. * Beispiel: ''size_t pos = text.find_last_of("aeiou");'' sucht nach dem letzten Vokal in der Zeichenkette und gibt dessen Position zurück. * ''text.find_first_not_of(string)'': Sucht nach dem ersten Zeichen, das nicht in der angegebenen Zeichenkette vorkommt. * Beispiel: ''size_t pos = text.find_first_not_of("aeiou");'' sucht nach dem ersten Zeichen, das kein Vokal ist. * ''text.find_last_not_of(string)'': Sucht nach dem letzten Zeichen, das nicht in der angegebenen Zeichenkette vorkommt. * Beispiel: ''size_t pos = text.find_last_not_of("aeiou");'' sucht nach dem letzten Zeichen, das kein Vokal ist. * ''text.substr(pos)'': Gibt einen Teilstring ab der Position ''pos'' bis zum Ende der Zeichenkette zurück. * Beispiel: ''string part = text.substr(5);'' gibt den Teilstring von der Position 5 bis zum Ende der Zeichenkette zurück. * ''text.substr(pos, len)'': Gibt einen Teilstring von der Position ''pos'' mit einer Länge von ''len'' zurück. * Beispiel: ''string part = text.substr(3, 4);'' gibt die 4 Zeichen ab der Position 3 zurück. * ''text.c_str()'': Gibt die Zeichenkette als C-String (nullterminiert) zurück. * Beispiel: ''const char* c_str = text.c_str();'' gibt den C-String zurück, der die Zeichenkette repräsentiert. * ''text.swap(string)'': Tauscht den Inhalt von zwei Zeichenketten. * Beispiel: ''text1.swap(text2);'' tauscht den Inhalt von ''text1'' und ''text2''. * ''text.resize(size)'': Ändert die Größe der Zeichenkette. Wenn die neue Größe kleiner ist, werden Zeichen abgeschnitten. Wenn sie größer ist, wird die Zeichenkette mit Nullzeichen (oder einem angegebenen Zeichen) aufgefüllt. * Beispiel: ''text.resize(10, 'x');'' sorgt dafür, dass die Zeichenkette 10 Zeichen lang ist und mit 'x' aufgefüllt wird. * ''text.find(string, pos)'': Sucht nach einer Teilzeichenkette ab der Position ''pos'' und gibt die Position des ersten Vorkommens zurück. Wenn nichts gefunden wird, wird ''string::npos'' zurückgegeben. * Beispiel: ''size_t pos = text.find("abc", 0);'' sucht nach dem ersten Vorkommen von "abc" ab der Position 0. * ''text.compare(string)'': Vergleicht zwei Zeichenketten lexikografisch. Gibt einen Wert kleiner als 0 zurück, wenn die erste Zeichenkette kleiner ist, einen Wert größer als 0, wenn sie größer ist, und 0, wenn sie gleich sind. * Beispiel: ''int result = text.compare("example");'' vergleicht ''text'' mit "example" und gibt den Vergleichswert zurück. ===== Beispiele ===== **1. Einfache Zeichenkettenverarbeitung** #include #include using namespace std; int main() { string name; cout << "Geben Sie Ihren Namen ein: "; cin >> name; cout << "Hallo, " << name << "!" << endl; return 0; } **Hinweis:** ''cin'' liest nur bis zum ersten Leerzeichen. Um eine ganze Zeile einzulesen, nutzt man ''getline()''. string text; cout << "Gib einen Text ein: "; getline(cin, text); // Liest die gesamte Zeile ein cout << text; **2. Zeichenkette bearbeiten** include #include using namespace std; int main() { string s = "C++ ist toll!"; s.insert(8, "wirklich "); cout << s << endl; return 0; } **Ausgabe:** ''C++ ist wirklich toll!'' **3. Zeichenkettenvergleich** #include #include using namespace std; int main() { string passwort = "geheim"; string eingabe; cout << "Passwort eingeben: "; cin >> eingabe; if (eingabe == passwort) { cout << "Zugang gewährt!" << endl; } else { cout << "Falsches Passwort!" << endl; } return 0; } **4. Ausgabe von einzelnen Zeichen** string text; cout << "Gib einen Text ein: "; cin >> text; // Nur ein Wort einlesen cout << "Einzelne Zeichen der Eingabe:\n"; for (int i = 0; i < text.length(); i++) { cout << "text[" << i << "] = " << text[i] << endl; } return 0; ===== Aufgaben ===== ===== Beginner ===== ==== 1. Zeichenkette eingeben und ausgeben ==== Schreibe ein Programm, das eine Zeichenkette vom Benutzer einliest und ausgibt. ==== 2. Länge einer Zeichenkette bestimmen ==== Schreibe ein Programm, das eine Zeichenkette einliest und deren Länge ausgibt. ==== 3. Zeichen an bestimmter Position ausgeben ==== Schreibe ein Programm, das eine Zeichenkette einliest und das Zeichen an einer bestimmten Position ausgibt. ==== 4. Zeichenkette rückwärts ausgeben ==== Schreibe ein Programm, das eine Zeichenkette einliest und sie rückwärts ausgibt. ==== 5. Vorkommen eines Zeichens zählen ==== Schreibe ein Programm, das eine Zeichenkette einliest und zählt, wie oft ein bestimmtes Zeichen vorkommt. ===== Intermediate ===== ==== 6. Zeichenkette in Großbuchstaben umwandeln ==== Schreibe ein Programm, das eine Zeichenkette einliest und alle Buchstaben in Großbuchstaben umwandelt. ==== 7. Zeichenkette in Kleinbuchstaben umwandeln ==== Schreibe ein Programm, das eine Zeichenkette einliest und alle Buchstaben in Kleinbuchstaben umwandelt. ==== 8. Palindrom überprüfen ==== Schreibe ein Programm, das prüft, ob eine eingegebene Zeichenkette ein Palindrom ist (vorwärts und rückwärts gleich). ==== 9. Leerzeichen entfernen ==== Schreibe ein Programm, das eine Zeichenkette einliest und alle Leerzeichen entfernt. ==== 10. Teilstring suchen ==== Schreibe ein Programm, das prüft, ob eine Zeichenkette in einer anderen Zeichenkette vorkommt. ===== Advanced ===== ==== 11. Wortanzahl bestimmen ==== Schreibe ein Programm, das die Anzahl der Wörter in einer eingegebenen Zeichenkette zählt. ==== 12. Erstes und letztes Wort ausgeben ==== Schreibe ein Programm, das das erste und das letzte Wort einer eingegebenen Zeichenkette ausgibt. ==== 13. Zeichen ersetzen ==== Schreibe ein Programm, das in einer Zeichenkette alle Vorkommen eines bestimmten Zeichens durch ein anderes ersetzt. ==== 14. Anagramm überprüfen ==== Schreibe ein Programm, das überprüft, ob zwei eingegebene Zeichenketten Anagramme sind (gleiche Buchstaben in anderer Reihenfolge). ==== 15. Häufigstes Zeichen finden ==== Schreibe ein Programm, das das häufigste Zeichen in einer Zeichenkette ermittelt und ausgibt.