Teil 1: Grundlagen


string, Teil 1

Für die Bearbeitung von Strings stellt die C++ Standardbibliothek die Klasse string zur Verfügung, die, ebenfalls wie z.B. cout, im Namensraum std liegt. Wird die Klasse string in einem Programm eingesetzt, ist die Header-Datei <string> einzubinden.

string-Objekt definieren

Ein string-Objekt wird prinzipiell wie eine 'normale' Variable definiert:

std::string sName;

sName ist der Name des string-Objekts ist.

Ein String kann bei seiner Definition mit einer Zeichenfolge initialisiert werden. Dabei folgt nach dem Namen des string-Objekts in geschweiften Klammer die in Anführungszeichen eingeschlossene Zeichenfolge mit dem Suffix s. Damit der Compiler das Suffix s kennt, ist dieses mittels using namespace std::string_literals; einzubinden.

string ausgeben und einlesen

Die Ausgabe unterscheidet sich nicht von der Ausgabe anderer Daten, d.h. das string-Objekt wird mit dem Operator << in den Ausgabestream einfügt.

Beim Einlesen eines Strings ist zu unterscheiden, ob die Wörter der Eingabe in getrennten Strings abgelegt werden sollen oder die gesamte Eingabe in einem String. Um die Wörter einer Eingabe in getrennten Strings abzulegen, sind entsprechend viele string-Objekte beim Einlesen anzugeben. Soll dagegen eine ganze Zeile in einem string-Objekt abgelegt werden, ist hierfür die Funktion getline() zu verwenden. Der (vereinfachte) Aufruf von getline() sieht wie folgt aus:

getline (stream, eingabe);  

stream ist eine Referenz auf den zu verwendenden Eingabestream ist, z.B. cin oder ein ifstream-Objekt, und eingabe eine Referenz auf das string-Objekt, in dem die Eingabe abgelegt werden soll.

#include <iostream> // Fuer Ein-/Ausgabe
#include <string>   // Fuer string-Objekte
using std::cin;
using std::endl;
using std::cout;
// Damit der Compiler das Suffix s kennt
using namespace std::string_literals;

int main()
{
    // string definieren und initialisieren
    std::string ausgabe { "Bitte geben Sie einen Text ein: "s };
    std::string eingabe; // Fuer die Eingaben

    // string ausgeben
    cout << ausgabe;
    // string einlesen, wortweise
    cin >> eingabe;
    // Erstes Wort der Eingabe ausgeben
    cout << "Das erste Wort ist: " << eingabe << endl;
    // Restliche Eingabe verwerfen, falls mehr als
    // ein Wort eingegeben wurde
    cin.ignore(999,'\n');

    // Text ausgeben
    cout << "Geben Sie einen weiteren Text ein: ";
    // string einlesen, zeilenweise
    std::getline(cin, eingabe);
    // Eingabe wieder ausgeben
    cout << "Ihre Eingabe war: " << eingabe << endl;
}

string Operationen

Folgende Operationen sind mit string-Objekten möglich:

  • Zuweisung: Weist einem string-Objekt ein weiteres string-Objekt, ein string-Literal oder einen C-String ( char-Feld) zu.
  • Addition: Fügt mittels des Operators + einem string-Objekt ein weiteres string-Objekt, ein string-Literal oder einen C-String hinzu.
  • Vergleich: Vergleicht mittels der Vergleichsoperator, wie z.B. < oder >=, ein string-Objekt mit einem weiteren string-Objekt, einem string-Literal oder einem C-String. Der Vergleich erfolgt hierbei lexikografisch, d.h. 'Aaaa' ist kleiner als 'Bb'.

Zugriff auf Zeichen im string

Um auf ein einzelnes Zeichen in einem string-Objekt zuzugreifen, wird der Indexoperator [] verwendet. Das erste Zeichen im string-Objekt hat dabei den Index 0. Um alle Zeichen in einem string-Objekt zu durchlaufen kann entweder eine range-for Schleife eingesetzt werden oder eine for-Schleife. Hierzu liefert die Memberfunktion size() die Anzahl der Zeichen im string-Objekt.

string Konvertierungen

string in const char*

Die Memberfunktion

const char* c_str();

konvertiert ein string-Objekt in einen const char-Zeiger (C-String). Damit ist es möglich, überall dort ein string-Objekt zu verwenden, wo ein const char-Zeiger erwartet wird.

Der umgekehrte Weg, einen C-String in ein string-Objekt zu konvertieren, erfolgt über den Zuweisungsoperator.

#include <iostream> // Fuer Ein-/Ausgabe
#include <string>   // Fuer string-Objekte
using std::cin;
using std::endl;
using std::cout;
// Damit der Compiler das Suffix s kennt
using namespace std::string_literals;

int main()
{
    // string definieren und initialisieren
    std::string ausgabe { "Bitte geben Sie einen Text ein: "s };
    std::string eingabe; // Fuer die Eingaben
    // string ausgeben
    cout << ausgabe;
    // string einlesen, zeilenweise
    getline(cin, eingabe);

    // Ersten und letzten Buchstaben ausgeben
    cout << "Der erste und der letzte Buchstabe ist: "
         << eingabe[0] << ',' << eingabe[eingabe.size()-1] << endl;

    // Eingabe buchstabenweise ausgeben mittel range-for Schleife
    for (auto letter : eingabe)
        cout << letter << ',';
    cout << endl;

    // Pruefen, ob 'Die Eingabe!" eingegeben wurde
    if (eingabe == "Die Eingabe!"s)
        cout << "Es wurde 'Die Eingabe!' eingegeben\n";
    else
        cout << "Es wurde etwas anderes als 'Die Eingabe!' eingegeben\n";

    // An die Eingabe noch einen string anhaengen
    std::string text = eingabe + " erweitert um einen string"s;
    cout << text << endl;
}

string in numerischen Wert

Für die Konvertierung eines Strings in einen numerischen Wert stehen die Funktionen

DTYP conv = stoX (const std::string& str);

zur Verfügung, wobei das X in stoX den Zieldatentyp definiert. Für X sind i, l, ll, ul und ull zugelassen, je nachdem, ob der Stringinhalt in einen int, long, long long, unsigned long oder unsigned long long Wert konvertiert werden soll; also z.B. stol(myVal); für die Konvertierung des Strings in einen long Wert. Enthält der string einen "Gleitkommawert", so ist für X f, d oder ld einzusetzen, ja nach dem, ob die Konvertierung in einen float, double oder long double erfolgen soll.

Die Funktionen haben noch optionale Parameter, um z.B. die Zahlenbasis für die Konvertierung in Ganzzahlen festzulegen.

string in mehrere numerischen Werte

Enthält ein String mehrere Werte die konvertiert werden sollen, kann der Stream istringsteam hierfür verwendet werden. Wenn Sie diesen Stream einsetzen, müssen Sie die Header-Datei <sstream> einbinden.

Um einen String in seine 'Einzelteile' zu zerlegen, ist zunächst ein istringstream-Objekt zu definieren, dem anschließend mit der Memberfunktion str() der zu zerlegenden String übergeben wird. Und ab diesem Zeitpunkt verhält sich istringstream genauso wie der Eingabestream cin, d.h. mithilfe des Operators >> werden die einzelnen Wörter bzw. Werte aus diesem Stream extrahiert.

Soll der Inhalt mehrere Strings hineinander konvertiert werden, so müssen Sie nach jeder Konvertierung den Status des Streams mittels der Memberfunktion clear() zurücksetzen.

#include <iostream>   // Fuer Ein-/Ausgabe
#include <string>     // Fuer string-Objekte
#include <sstream>    // Fuer stringstream-Objekte
using std::endl;
using std::cout;
// Damit der Compiler das Suffix s kennt
using namespace std::string_literals;

int main()
{
    // strings mit einem 'Wert'
    std::string s1{ "10"s };
    std::string s2{ "3.14"s };
    // Numerische Variablen definieren
    short sVar;
    float fVar;

    // Einzelwerte in konvertieren
    sVar = stoi(s1);
    fVar = stof(s2);
    // Werte ausgeben
    cout << "s1 inkrementiert ergibt: " << ++sVar
         << "\nund s2 inkrementiert: " << ++fVar << endl;

    // string mit mehreren Werten
    std::string s3{ "1.1 100"s };
    std::string s4{ "99 3.3"s };
    // istringstream-Objekt definieren
    std::istringstream is;
    // Ersten String im istringstream-Objekt verbinden
    is.str(s3);
    // Werte aus istringstream auslesen und ausgeben
    is >> fVar >> sVar;
    cout << "fVar: " << fVar << ", sVar: " << sVar << endl;
    // istringstream zuruecksetzen!
    is.clear();
    // Zweiten string mit istringstream verbinden
    is.str(s4);
    // Werte wieder auslesen und ausgeben
    is >> sVar >> fVar;
    cout << "sVar: " << sVar << ", fVar: " << fVar << endl;
}

Einen Wert in einen string

Um einen numerischen Wert in einen String umzuwandeln, steht die Funktion to_string() zur Verfügung.

std::string res = std::to_string(val);

val ist die zu konvertierende Ganzzahl oder Gleitkommazahl.

Mehrere Werte in einen string

Um mehrere Werte in einen String zu konvertieren, wird wiederum ein Stream verwendet, diesmal der Stream ostringstream. Auch hierfür müssen Sie die Header-Datei <sstream> einbinden.

Um Daten in einen String zu konvertieren, ist zunächst ein ostringstream-Objekt zu definieren, in das anschließend die Daten, genauso wie beim cout-Stream, mit dem Operator << übertragen werden. Um auf den Inhalt des Streams (das ist der String mit den konvertierten Daten) zuzugreifen, ist die Memberfunktion str() aufzurufen.

#include <iostream>   // Fuer Ein-/Ausgabe
#include <string>     // Fuer string-Objekte
#include <sstream>    // Fuer stringstream-Objekte
using std::endl;
using std::cout;
// Damit der Compiler das Suffix s kennt
using namespace std::string_literals;

int main()
{
    // strings definieren
    std::string s1, s2;
    // Numerische Variablen definieren / initialsieren
    short sVar = 10;
    float fVar = 3.14f;

    // Einzelwerte in konvertieren
    s1 = std::to_string(sVar);
    s2 = std::to_string(fVar);
    cout << "Werte in getrennten strings: " << s1
         << " und " << s2 << endl;

    // Mehrere Werte konvertieren mit Trennzeichen
    std::ostringstream os;
    os << sVar << ',' << fVar;
    cout << "Werte in einem string: " << os.str() << endl;
    // Ganzzahl als Hex-Zahl in string
    // istringstream Puffer leeren!
    os.str("");
    os << std::hex << sVar;
    cout << "Wert als 'Hex-string': " << os.str() << endl;
}



Copyright © cpp-tutor.de
Impressum &Datenschutz