String-Verarbeitung in C++: C-Style und std::string
Lernen Sie String-Verarbeitung in C++ mit C-Style-Strings und std::string anhand praktischer Beispiele.
In C++ können Text- (String-) Operationen sowohl mit klassischen C-Style-Zeichenarrays (char arrays)
als auch mit der modernen std::string-Klasse durchgeführt werden.
C-Style-Arrays bieten eine niedrigstufige Kontrolle, während die std::string-Klasse sicherer und bequemer ist.
In diesem Artikel werden wir alle Aspekte der Arbeit mit Zeichenketten im Detail untersuchen.
1. C-Style-Strings (char Arrays)
C-Style-Strings sind char-Arrays, die mit einem Nullzeichen ('\0') enden.
Sie werden im Speicher als fortlaufende Zeichenfolge gespeichert.
#include <iostream>
using namespace std;
int main() {
char nachricht1[] = "Hallo"; // '\0' wird automatisch hinzugefügt
char nachricht2[20] = "C++"; // Maximal 19 Zeichen + '\0'
cout << nachricht1 << " " << nachricht2 << endl;
return 0;
}
Beim Arbeiten mit C-Style-Strings ist es wichtig, nicht über die Grenzen des Arrays hinauszuschreiben. C++ überprüft bei C-Style-Strings keine Array-Grenzen automatisch.
2. strcpy, strcat, strlen, strcmp (C-String-Funktionen)
Beim Arbeiten mit C-Style-Strings werden häufig die Funktionen aus der <cstring>-Bibliothek verwendet:
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char a[20] = "C++";
char b[20] = "Programmierung";
// Verketten
strcat(a, " "); // a = "C++ "
strcat(a, b); // a = "C++ Programmierung"
// Kopieren
char c[20];
strcpy(c, a);
// Länge
cout << "Länge: " << strlen(a) << endl;
// Vergleich
if (strcmp(a, c) == 0)
cout << "A und C sind gleich." << endl;
cout << "Ergebnis: " << a << endl;
}
Diese Funktionen müssen mit Vorsicht verwendet werden, da sie ein Pufferüberlauf-Risiko bergen.
In modernem C++ wird empfohlen, stattdessen std::string zu verwenden.
3. Einführung in die std::string-Klasse
In modernem C++ wird die <string>-Bibliothek für Textverarbeitung verwendet.
std::string kann dynamisch wachsen, verwaltet den Speicher automatisch und bietet viele nützliche Funktionen.
#include <iostream>
#include <string>
using namespace std;
int main() {
string vorname = "Ali";
string nachname = "Yilmaz";
string vollerName = vorname + " " + nachname;
cout << "Hallo " << vollerName << endl;
return 0;
}
Der Typ std::string kann mit dem Operator + einfach verkettet werden
und mit == direkt verglichen werden.
4. Grundlegende String-Operationen
| Operation | Beschreibung | Beispiel |
|---|---|---|
| Verketten | Verbindet zwei Strings | a + b |
| Länge | Gibt die Zeichenanzahl zurück | a.length() oder a.size() |
| Zeichenzugriff | Zugriff über Index | a[0], a.at(2) |
| Teilstring | Extrahiert einen Abschnitt | a.substr(2, 4) |
| Vergleich | Alphabetischer Vergleich | a.compare(b) |
| Leer? | Prüft, ob der String leer ist | a.empty() |
| Löschen | Löscht den Inhalt | a.clear() |
string text = "Programmierung";
cout << text.length() << endl; // 14
cout << text.substr(0, 7) << endl; // "Program"
5. Suchen, Ersetzen und Löschen
std::string bietet viele leistungsstarke Funktionen zur Textverarbeitung:
string nachricht = "C++ Programmiersprache";
// Suchen
size_t position = nachricht.find("Programmier");
if (position != string::npos)
cout << "'Programmier' gefunden bei Index: " << position << endl;
// Ersetzen
nachricht.replace(4, 11, "modern"); // ersetzt ab Index 4 elf Zeichen
cout << nachricht << endl; // "C++ moderne Sprache"
// Löschen
nachricht.erase(4, 7); // löscht ab Index 4 sieben Zeichen
cout << nachricht << endl; // "C++ Sprache"
Die Methode find() gibt string::npos zurück, wenn der gesuchte Text nicht gefunden wird.
Dieser Wert bedeutet „nicht gefunden“.
6. Zeichenweise Operationen
Da ein String aus Zeichen besteht, kann er mit Schleifen Zeichen für Zeichen verarbeitet werden.
#include <iostream>
#include <string>
using namespace std;
int main() {
string wort = "Cplusplus";
for (char c : wort) {
cout << c << " ";
}
cout << endl;
// In Großbuchstaben umwandeln
for (char &c : wort) {
c = toupper(c);
}
cout << wort << endl;
}
Für die Zeichentransformation können die Funktionen toupper() und tolower()
aus der Bibliothek <cctype> verwendet werden.
7. Umwandlungsoperationen (string <→ int, double)
Eine std::string kann in numerische Werte umgewandelt werden und umgekehrt.
#include <iostream>
#include <string>
using namespace std;
int main() {
string zahlText = "42";
int zahl = stoi(zahlText); // string → int
double d = stod("3.14"); // string → double
cout << zahl + 10 << endl; // 52
cout << d * 2 << endl; // 6.28
// int → string
int alter = 25;
string text = to_string(alter);
cout << "Alter: " << text << endl;
}
8. Vergleich (compare, ==, <, >)
Strings können entweder mit der Methode compare() oder mit Vergleichsoperatoren verglichen werden.
string a = "Ali";
string b = "Veli";
if (a == b)
cout << "Gleich" << endl;
else if (a < b)
cout << "A steht alphabetisch davor" << endl;
else
cout << "A steht alphabetisch danach" << endl;
9. Ein- und Ausgabeoperationen
Das Objekt cin liest Eingaben nur bis zum ersten Leerzeichen.
Wenn du eine ganze Zeile einlesen möchtest, verwende die Funktion getline().
#include <iostream>
#include <string>
using namespace std;
int main() {
string name;
cout << "Geben Sie Ihren Namen ein: ";
cin >> name;
cout << "Hallo, " << name << endl;
cin.ignore(); // Entfernt das Newline-Zeichen aus dem Eingabepuffer
string satz;
cout << "Geben Sie einen Satz ein: ";
getline(cin, satz);
cout << "Ihr Satz: " << satz << endl;
}
getline() liest die gesamte Zeile einschließlich der Leerzeichen.
10. Beispielanwendung: Textanalyse
Im folgenden Beispiel wird die Anzahl der Wörter und Buchstaben in einem vom Benutzer eingegebenen Text gezählt.
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main() {
string text;
cout << "Geben Sie einen Satz ein: ";
getline(cin, text);
int buchstabenAnzahl = 0;
int wortAnzahl = 1;
for (char c : text) {
if (isalpha(c))
buchstabenAnzahl++;
if (c == ' ')
wortAnzahl++;
}
cout << "Buchstabenanzahl: " << buchstabenAnzahl << endl;
cout << "Wörteranzahl: " << wortAnzahl << endl;
return 0;
}
11. TL;DR
- C-Strings sind
char[]-Arrays und müssen vorsichtig verwendet werden. - In modernem C++ wird die Verwendung der Klasse
std::stringempfohlen. - Grundlegende Operationen:
+,length(),substr(),find(),replace(),erase(). - Für numerische Umwandlungen verwende
stoi(),stod()undto_string(). getline()kann Texte mit Leerzeichen einlesen.- Alle Beispiele können in Visual Studio 2022 oder GCC 11+ ausgeführt werden.