Advanced Java Services | STL string |
Eine vollständige Dokumentation der Klasse string findet man auf den beiden Referenzseiten
http://www.cplusplus.com/reference/string/string/string/ http://en.cppreference.com/w/cpp/string/basic_string
Die Klasse string kapselt einen klassischen c-String und stellt eine Vielzahl von Methoden zur Stringbearbeitung bereit. Sie wird hier mit einer Reihe von Beispielen vorgestellt.
#include <string> using namespace std;
Konstruktoren | |
---|---|
string() |
Constructs an empty string, with a length of zero characters. |
string (const string& str); |
Kopierkonstruktor. |
string (const string& str, size_t pos, size_t len = npos) |
Substring constructor. Copies the portion of str that begins at the character position pos and spans len characters (or until the end of str, if either str is too short or if len is string::npos) |
string(const char* s) |
Creates a string from a c-string (Copies the null-terminated character sequence (C-string) pointed by s) |
string(const char* s, size_t n) |
Creates a string from a char-array. Copies the first n characters from the array of characters pointed by s |
string(size_t n, char c) |
Fill constructor. Fills the string with n consecutive copies of character c. |
string(InputIterator first, InputIterator last) |
Range constructor. Creates a string with a copy of the sequence of characters in the range [first,last) |
string(initializer_list<char> il) |
initializer list. Creates a string with a copy of each of the characters in il, in the same order. |
string(string&& str) noexcept |
move constructor.
Acquires the contents of str. str is left in an unspecified but valid state. |
Vorgestellt werden: Der Indexoperator [], und die Methoden at(), c_str(), empty(), length(), size(), max_size(), capacity(), clear().
void elementAccess() { string satchmo("louis armstrong"); satchmo[0] = 'L'; satchmo.at(6) = 'A'; // gibt referenz zurück ! cout << satchmo << endl; const char* cstr = satchmo.c_str(); cout << cstr << endl; cout << satchmo[26] << endl; // wirft keine exception cout << satchmo.at(26) << endl; // throws std::out_of_range if pos >= size(). if( satchmo.empty()) cout << "leerer string" << endl; cout << "length = " << satchmo.length() << endl; // length = 15 cout << "size = " << satchmo.size() << endl; // size = 15 cout << "max_size = " << satchmo.max_size() << endl; // max_size = 1073741820 cout << "capacity = " << satchmo.capacity() << endl; // capacity = 15 satchmo = satchmo + " tp"; // + überladen cout << "capacity = " << satchmo.capacity() << endl; // capacity = 30 satchmo.clear(); cout << "after clear: " << satchmo << endl; cout << "size = " << satchmo.size() << endl; // 0 cout << "length = " << satchmo.length() << endl; cout << "capacity = " << satchmo.capacity() << endl; // 30 }
Es gibt die folgenden Iteratoren
string::iterator string::const_iterator string::reverse_iterator string::const_reverse_iterator
for (string::iterator iter = duke.begin(); iter != duke.end(); ++iter) // cout << *iter; cout << endl; for (auto iter = duke.begin(); iter != duke.end(); ++iter) // cout << *iter; cout << endl; for (string::reverse_iterator iter = duke.rbegin(); iter != duke.rend(); ++iter) cout << *iter; cout << endl; for (auto iter = duke.rbegin(); iter != duke.rend(); ++iter) { *iter = std::toupper(*iter); cout << *iter; } cout << endl; for(string::const_iterator citer = duke.begin(); citer != duke.end(); ++citer) cout << *citer; cout << endl;
Der for_each Funktion kann als letztere Parameter entweder ein Funktionspointer oder ein Lambda-ausdruck übergeben werden, oder aber auch ein Objekt einer Klasse, die einen passenden function-call Operator enthält. Das folgenden Beispiel zeigt das mit der Funktion action() und mit dem Objekt myObject eines anonymen structs.
void iteratoren_for_each() { string duke("duke ellington"); // for-each Schleife for(char ch : duke) { cout << ch; } cout << endl; // for_each Funktion, übergabe eines Funktionspointers for_each(duke.begin(), duke.end(), action); std::cout << '\n'; // for_each Funktion mit Lambda-ausdruck for_each(duke.begin(), duke.end(), [](char ch) {ch = std::toupper(ch) ; cout << ch;} ); std::cout << '\n'; // for_each Funktion mit Objektübergabe for_each(duke.begin(), duke.end(), myObject ); std::cout << '\n'; } void action(char ch) { cout << ch; } struct { // function call operator void operator()(char ch) { std::cout << ch; } } myObject; // Objekt einer anonymen Klasse
Vorgestellt werden die Methoden find(), find_first_of(), find_last_of(), replace(), erase(), max_size(), capacity(), clear().
void beispiel1() { // string objekte haben kein \0 am Ende: Josuttis 474 ! string s1 = "bild.jpg"; cout << s1 << endl; // 4 string::size_type pos = s1.find('.'); // ist entweder unsigned int oder unsigned long, auf diese weise wird maschinenunabhängigkeit erreicht // immer diese Typen benützen cout << "Punkt ist an der Position " << pos << endl; // 4 string ext = s1.substr(pos+1); cout << "Dateiendung ist " << ext << endl; // 4 string replaced = s1.replace (pos+1, 3, "png"); cout << "Neuer Dateiname: " << replaced << endl; size_t posx = s1.find('x'); cout << "find liefert : " << posx << endl; // 4294967295 = 2^32 - 1 cout << "string::npos = " << string::npos << endl; // 4294967295 cout << "s.max_size() = " << s1.max_size() << endl; // 1073741820 = 2^30 - 4 // es gibt einen speziellen Wert, falls die Suche erfolglos ist string::npos // Dieser Wert liegt über dem, den max_size() liefert if (posx == string::npos) { cout << "Zeichen " << 'x' << " kommt nicht vor" << endl; } }
void beispiel2() { string s2 = "C:\\eclipse-workspaces\\cdt\\C++_04_string_2\\src\\C++_04_string_2.cpp\\"; cout << s2 << endl; size_t firstpos = s2.find_first_of('\\'); size_t lastpos = s2.find_last_of('\\'); cout << "Erster Backslash an Position " <<firstpos << endl; // 4 cout << "Letzter Backslash an Position " << lastpos << endl; // 65 cout << endl; // cout << "Suche ab der Position 100" << endl; size_t slashpos = s2.find('\\', 100); if ( slashpos == string::npos) cout << "Zeichen nicht gefunden\n" << endl; // kein Fehler wenn der zweite Parameter > Stringlänge ! // es wird einfach string::npos geliefert cout << "Backsslash an den Positionen " << endl; for (size_t spos = 0, pos = 0 ; spos < s2.length() ; ) { pos = s2.find('\\', spos); if (pos!=string::npos) { cout << pos << " " ; spos = pos+1; } else break; } cout << endl; //string& erase (size_t pos = 0, size_t len = npos); // npos heißt bis zum Ende cout << "Lösche letztes Zeichen" << endl; string s3 = s2.erase(s2.length()-1,1); cout << s3 << endl; }