Die von C geerbten Zeichenketten haben den großen Nachteil, dass der Speicher nicht dynamisch nach Anforderung belegt wird, sondern dass immer so viel Speicher blockiert wird, wie im schlechtesten Fall erforderlich ist. Auch das Fehlerpotenzial, das durch das Fehlen der Abschluss-Null und der fehlenden Kontrolle der Speichergrenzen entsteht, hat viele Programmierer veranlasst, eine eigene Stringklasse zu schreiben. Inzwischen ist aber eine Klasse string in der Standardbibliothek verfügbar.
Um ein Objekt vom Typ string zu definieren, muss zunächst die Datei string eingebunden werden. Sie endet wie viele Header-Dateien der Standardbibliothek von C + + nicht auf .h. Die Klasse string liegt im Namensraum std. Sofern Sie nicht jedes Mal std::string angeben wollen, um einen String zu definieren, ziehen Sie zu Anfang den Namensraum std mit dem Befehl using hinzu:
#include <string> using namespace std; int main (void) { string meinName; return 0; }
Ein Objekt vom Typ string verhält sich in vielen Dingen kompatibel zum char-Array. Der Zugriff auf die einzelnen Zeichen eines Strings erfolgt wie beim klassischen C-String durch die eckigen Klammern. Es ist möglich, Strings mit C-Strings zu initialisieren. Sie können sie ineinander umformen und miteinander vergleichen.
Der Hauptunterschied besteht darin, dass Sie einen String nicht über einen char-Zeiger manipulieren können, wie Sie das mit einem char-Array gemacht haben. Ein Objekt der Klasse string besteht ja nicht nur aus den Zeichen selbst. Wenn Sie also einen Zeiger auf den String verwenden, zeigt dieser nicht auf den ersten Buchstaben, sondern auf das Objekt, das die Zeichen verwaltet. Da das Objekt in der Lage sein muss, die Daten an eine andere Stelle zu kopieren, wenn die Zeichenkette größer wird, ist es gar nicht ratsam, mit einem Zeiger auf die Zeichen direkt zuzugreifen. Stattdessen bietet die Klasse eigene Zeiger an, die »Iteratoren« genannt werden. Sie erfordern allerdings eine besondere Handhabung. Wir werden darauf noch zurück kommen. Das Fehlen der direkten Zugriffe schränkt den Programmierer zwar ein, erhöht aber die Sicherheit des Programms.
Die Klasse string bietet gegenüber den klassischen C-Strings einige Vorteile. So muss beim Anlegen eines Objekts nicht angegeben werden, wie viele Zeichen reserviert werden sollen. Wird mehr Platz benötigt, sorgt das Objekt selbst dafür, dass es den erforderlichen Speicherbereich bekommt. Der größte Vorteil ist vielleicht, dass Sie Strings einfach zuweisen und vergleichen können, wie Sie es von Integer-Variablen gewöhnt sind.
Ein String kann durch eine Zuweisung direkt in eine andere Stringvariable kopiert werden. Sie brauchen also keine spezielle Funktion strcpy(), müssen auch keine Schleife über die Elemente machen, nicht darüber nachdenken, ob die Abschluss-Null gesetzt ist, und nicht kontrollieren, ob der Zielspeicher für eine Kopie überhaupt ausreicht. Sie können dem string-Objekt sogar ohne eine explizite Konvertierung einen klassischen C-String zuweisen.
Strings können aneinander gehängt werden, indem ein einfaches Pluszeichen zwischen sie gestellt wird.
#include <string> using namespace std; int main (void) { string meinName = "neu"; char oldName[25] = "alt"; string neuString; neuString = meinName; // "neu" neuString = oldName; // "alt" neuString = meinName + oldName; // "neualt" neuString += oldName; // "neualtalt" return 0; }
Im Gegensatz zu den C-Strings können für Abfragen jetzt die einfachen Operatoren verwendet werden, die bereits von den Zahlenvergleichen bekannt sind. Es sind also keine speziellen Funktionen wie strcmp() mehr erforderlich.
| Operator | Bedeutung |
|---|---|
| == | gleich |
| != | ungleich |
| < | in lexikalischer Reihenfolge vorher |
| > | in lexikalischer Reihenfolge nachher |
| < = | in lexikalischer Reihenfolge vorher oder gleich |
| > = | in lexikalischer Reihenfolge nachher oder gleich |
Für den Vergleich reicht es, dass einer der beiden Operanden vom Typ string ist. Er kann sowohl mit einem klassischen C-String als auch mit einem char verglichen werden. Die Reihenfolge spielt keine Rolle.
string s; char cstring[256]; ... if (s < cstring) ... if (cstring < s)
Darüber hinaus bringt die Klasse string eine Reihe anderer Funktionen mit, die in Tabelle (tabstringfunction) aufgeführt sind.
| Funktion | Aufgabe |
|---|---|
| length() | liefert die Länge des Strings |
| insert(n, s) | fügt den String s an Position n ein |
| erase(p, n) | Entfernt ab Position p n Zeichen |
| find(s) | Liefert die Position, an der sich der String s befindet |
| substr(pos1, pos2) | Gibt den Substring von der Position 1 bis zur Position 2 zurück |
Beispiel:
Im folgenden Code-Ausschnitt sind die Funktionen noch einmal in einem Programm dargestellt. In den Kommentaren stehen die Ergebnisse der Funktion.
#include <string> using namespace std; int main() { string s("123"); // Konstruktor fuer C-String len = s.length(); // liefert 3, die Laenge des Strings s.insert(2, "xy"); // s ist nun "12xy3" s.erase(2,2); // s ist nun "123" pos = s.find("23"); // liefert die Position 1 s.substr(0,2); // liefert den Substring von der Position 0 bis 2 --> 12 }