source.by

Strings - Zeichenketten

Source 2020: https://www.kompf.de/cplus/artikel/strings.html | 2020-06-15

        <!DOCTYPE html>
<html lang="de">
<head>
<meta name="generator" content="HTML Tidy for HTML5 for Linux version 5.2.0">
<title>Strings - Zeichenketten</title>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta content="Martin Kompf" name="author">
<meta content="c,c++,cplusplus,programmierung,softwareentwicklung,strings,zeichenketten,stl" name="keywords">
<meta content="Martin Kompf" name="publisher">
<meta content="NEVER" name="expires">
<meta content="INDEX,FOLLOW" name="robots">
<style media="all" type="text/css">
@import "/style/kompf.css";
</style>

<style media="print" type="text/css">
@import "/style/kompf-print.css";
</style>

<style media="only screen and (max-width: 480px)" type="text/css">
@import "/style/kompf-mobile.css";
</style>
<meta content="2019-05-11T18:29:19+02:00" name="date">
<meta content="initial-scale=1, minimum-scale=0.75, width=device-width" name="viewport">
<link href="https://www.kompf.de/cplus/artikel/strings.html" rel="canonical">
</head>
<body>
<img alt="" height="1" src="https://ssl-vg03.met.vgwort.de/na/80847361a0e5726ba39f27c005f64a" width="1">
<div id="Header"><a href="//www.kompf.de">Kompf.de</a> > <a href="//www.kompf.de/cplus">C/C++</a> > <a href="//www.kompf.de/cplus/artikel/index.html">Artikel</a></div>
<div id="Content">
<h1>Strings - Zeichenketten</h1>
<p class="author">Martin Kompf</p>
<p class="intro">Für den C-Programmierer ist die Beschäftigung mit Zeichenketten eine nervende und zeitraubende Tätigkeit. Für den Nutzer der STL unter C++ wird dagegen alles gut...</p>
<div></div>
<p>Zeichenketten werden in Standard-C auf den Datentyp <tt class="keyword">char*</tt> abgebildet. Es stehen dann zwar auch Funktionen für Verkettung, Vergleich, Kopie usw. zur Verfügung, jedoch muß sich der Entwickler um das Speichermanagement und Tests gegen Bereichsüberschreitungen selbst kümmern. Dies ist zeitraubend und fehleranfällig. Gerade "vergessene" Tests gegen Überschreiben des reservierten Speicherbereichs für Zeichenketten haben immer wieder zu Sicherheitslücken besonders in Netzwerkprogrammen geführt.</p>
<p>Der C++-Programmierer hat mit dem Datentyp <em>string</em> aus der Standard-Template-Library (STL) nun die Möglichkeit, alle diese Probleme zu umschiffen. Insbesondere übernimmt die <tt>string</tt>-Klasse das Reservieren des notwendigen Speichers, seine gegebenenfalls notwendige Erweiterung und bewahrt vor Speicherlecks und -überschreibern.</p>
<p>In der folgenden Liste sind die wichtigsten Operationen, die mit <tt>string</tt> Objekten ausgeführt werden können, zusammengefaßt. Zur Benutzung muß lediglich per</p>
<pre class="cplus">
<span class="preprocessor">#include <string></span>
</pre>
<p>das entsprechende STL-Headerfile eingebunden werden. Dieses definiert <tt>string</tt> im Namespace <tt>std</tt>, so daß für die korrekte Ansprache <tt>std::string</tt> verwendet werden muß. Oder aber es erfolgt ein Import des kompletten Namespaces mittels</p>
<pre class="cplus">
<span class="keyword">using</span> <span class="keyword">namespace</span> std;
</pre>
<ol>
<li><strong>Konstruktion</strong>
<pre class="cplus">
string s;            <span class="slashslashcomment">// erzeugt einen leeren String</span>
string s(<span class="quotedstring">"abcdef"</span>);  <span class="slashslashcomment">// erzeugt String aus char*</span>
string s(80, <span class="quotedstring">' '</span>);   <span class="slashslashcomment">// erzeugt String aus 80 Leerzeichen</span>
</pre></li>
<li><strong>Zuweisung</strong>
<pre class="cplus">
string s, s1;
s = <span class="quotedstring">'a'</span>;             <span class="slashslashcomment">// Zuweisung eines char</span>
s = <span class="quotedstring">"abcd"</span>;          <span class="slashslashcomment">// Zuweisung eines char*</span>
s = s1;              <span class="slashslashcomment">// Zuweisung eines string</span>
</pre></li>
<li><strong>Elementzugriff</strong>
<pre class="cplus">
<span class="slashslashcomment">// Das erste Element hat den Index 0</span>
<span class="keyword">char</span> c = s[5]; <span class="slashslashcomment">// unbestimmtes Resultat, wenn s kürzer als 6 Zeichen ist!</span>
<span class="keyword">char</span> d = s.at(5); <span class="slashslashcomment">// besser</span>
</pre></li>
<li><strong>Größe</strong>
<pre class="cplus">
string::size_type n = s.size();
</pre></li>
<li><strong>Konvertierung nach char*</strong>
<pre class="cplus">
<span class="keyword">const</span> <span class="keyword">char</span> *c = s.c_str();
</pre></li>
<li><strong>Vergleich</strong>
<pre class="cplus">
string s1, s2;
<span class="keyword">int</span> r = s1.compare( s2);
r = s1.compare( <span class="quotedstring">"abc"</span>);
r = s1.compare( pos1, n1, s2, pos2, n2);
</pre>
Die letzte Form vergleicht Teilzeichenketten von s1 und s2 beginnend ab pos mit der Länge n.<br clear="none">
compare liefert 0 als Rückgabewert, wenn die Zeichenketten gleich sind, einen negativen Wert, wenn s1 lexikografisch vor s2 steht und einen positiven Wert wenn umgekehrt.<br clear="none">
Außerdem können Strings mit den üblichen Vergleichsoperatoren == != < > >= und <= verglichen werden:
<pre class="cplus">
<span class="keyword">if</span> (s1 == s2) <span class="slashslashcomment">// ...</span>
</pre></li>
<li><strong>Anhängen</strong>
<pre class="cplus">
string s, s1;
s += s1;
s += <span class="quotedstring">"qwertz"</span>;
s += <span class="quotedstring">'x'</span>;
s.append( s1, pos, n);
s.append( <span class="quotedstring">"zuiop"</span>);
</pre></li>
<li><strong>Einfügen</strong>
<pre class="cplus">
string s, s1;
<span class="slashslashcomment">// Füge Zeichen vor pos ein</span>
s.insert( pos, s1);
s.insert( pos, <span class="quotedstring">"abcdef"</span>);
s.insert( pos, 5, <span class="quotedstring">' '</span>);
</pre></li>
<li><strong>Verkettung</strong><br clear="none">
Strings können mit dem Operator + verkettet werden. Dabei kann auf einer Seite des Ausdrucks auch eine C-Zeichenkette vom Typ char* stehen.
<pre class="cplus">
string s, s1, s2;
s = s1 + s2;
s = s1 + <span class="quotedstring">" xxx "</span> + s2;
</pre></li>
<li><strong>Suchen</strong><br clear="none">
Zum Finden eines kommpletten Substrings gibt es die Funktionen find und rfind:
<pre class="cplus">
string s = <span class="quotedstring">"der Name der Rose"</span>;
<span class="keyword">int</span> i1 = s.find(<span class="quotedstring">"der"</span>);    <span class="slashslashcomment">// liefert 0</span>
<span class="keyword">int</span> i2 = s.rfind(<span class="quotedstring">"der"</span>);   <span class="slashslashcomment">// liefert 9</span>
</pre>
Zum Suchen einzelner Zeichen dienen dagegen die Funktionen find_first_of, find_last_of, find_first_not_of, find_last_not_of. Der Einsatz einiger dieser Funktionen wird an der nachfolgenden Funktion zur Aufteilung von Zeichenketten an bestimmten Trennzeichen demonstriert:
<pre class="cplus">
<span class="slashslashcomment">// Funktion zum Aufteilen einer Zeichenkette an Trennzeichen</span>
<span class="slashslashcomment">// Parameter:</span>
<span class="slashslashcomment">// line   [in]   string   aufzuteilende Zeichenkette</span>
<span class="slashslashcomment">// sep    [in]   char*    Menge von Trennzeichen</span>
<span class="slashslashcomment">// words  [out]  vector<string> Vektor mit den getrennten Substrings</span>
<span class="keyword">void</span> fsplit(<span class="keyword">const</span> std::string line, <span class="keyword">const</span> <span class="keyword">char</span>* sep,
            std::vector<std::string> & words)
{
    std::string::size_type a = 0, e;
    <span class="keyword">while</span> ( (a = line.find_first_not_of( sep, a)) != std::string::npos) {
        e = line.find_first_of( sep, a);
        <span class="keyword">if</span> (e != std::string::npos) {
            words.push_back( line.substr( a, e-a));
            a = e +1;
        }
        <span class="keyword">else</span> {
            words.push_back( line.substr( a));
            <span class="keyword">break</span>;
        }
    }
}
</pre></li>
<li><strong>Ersetzen</strong>
<pre class="cplus">
string s, s1;
<span class="slashslashcomment">// ersetze Zeichen von i bis i+n</span>
s.replace( i, n, s1);
s.replace( i, n, s1, i1, n1);
s.replace( i, n, <span class="quotedstring">"abcdef"</span>);

string r = <span class="quotedstring">"Der Fuchs ist in der Hundehütte"</span>;
<span class="slashslashcomment">// Wie? Ersetze Fuchs mit Hund!</span>
r.replace( r.find( <span class="quotedstring">"Fuchs"</span>), strlen(<span class="quotedstring">"Fuchs"</span>), <span class="quotedstring">"Hund"</span>);
</pre></li>
<li><strong>Löschen</strong>
<pre class="cplus">
s.erase( i, n);   <span class="slashslashcomment">// Lösche s von i bis i+n</span>
s.erase();        <span class="slashslashcomment">// Lösche s komplett</span>
</pre></li>
<li><strong>Teilzeichenketten</strong>
<pre class="cplus">
s1 = s.substr( i, n); <span class="slashslashcomment">// n Zeichen ab dem i-ten Zeichen von s</span>
</pre></li>
<li><strong>Ein- Ausgabe</strong><br clear="none">
Die Operatoren >> und << sind für die Ein- und Ausgabe von Zeichenketten definiert.
<pre class="cplus">
string s;
cin >> s;
cout << <span class="quotedstring">"Du schriebst: "</span> << s << endl;
</pre>
Mittels der Funktion getline() kann eine Datei zeilenweise in einen String gelesen werden:
<pre class="cplus">
string buffer;
ifstream infile;
infile.open(<span class="quotedstring">"/etc/passwd"</span>);
<span class="keyword">while</span> (getline( infile, buffer)) cout << buffer << endl;
</pre></li>
</ol>
<div></div>
</div>
<div id="Footer">
<div class="copyright">Copyright © 2019 Martin Kompf. All rights reserved. <a href="/imprint.html">Impressum</a> <a href="/imprint.html">Datenschutzerklärung</a></div>
</div>
<div id="Menu">
<div xmlns="" class="menuItem"><a href="index.html">Übersicht</a></div>
<div xmlns="" class="menuItem"><a href="../../imprint.html">Impressum</a></div>
<div xmlns="" class="menuLabel">Sprache</div>
<div xmlns="" class="menuItem"><a href="poly.html">Polymorphie</a></div>
<div xmlns="" class="menuItem"><a href="perfmess.html">Performancetuning</a></div>
<div xmlns="" class="menuItem"><a href="namespace.html">Namespaces</a></div>
<div xmlns="" class="menuItem"><a href="refcnt.html">Reference Counting</a></div>
<div xmlns="" class="menuItem"><a href="templates.html">Templates (1)</a></div>
<div xmlns="" class="menuItem"><a href="templates2.html">Templates (2)</a></div>
<div xmlns="" class="menuItem"><a href="funcpar.html">Parameterübergabe</a></div>
<div xmlns="" class="menuItem"><a href="const.html">Konstanten</a></div>
<div xmlns="" class="menuItem"><a href="errc.html">Programmierfehler</a></div>
<div xmlns="" class="menuItem"><a href="exceptions.html">Exceptions</a></div>
<div xmlns="" class="menuLabel">Standard Template Library (STL)</div>
<div xmlns="" class="menuItem"><a href="container.html">Container</a></div>
<div xmlns="" class="menuItem"><a href="functors.html">Functors</a></div>
<div xmlns="" class="menuItem"><a href="random_shuffle.html">Zufälle</a></div>
<div xmlns="" class="menuItem"><a href="autoptr.html">Zeigerautomatik</a></div>
<div xmlns="" class="menuItem"><a href="stream1.html">Streams (1)</a></div>
<div xmlns="" class="menuItem"><a href="stream2.html">Streams (2)</a></div>
<div xmlns="" class="menuItem"><a href="stream3.html">Streams (3)</a></div>
<div xmlns="" class="menuItem"><a href="stream4.html">Streams (4)</a></div>
<div xmlns="" class="menuItem"><a href="vectorlist.html">Vektoren</a></div>
<div xmlns="" class="menuItem"><span class="menuSelected">Strings</span></div>
<div xmlns="" class="menuItem"><a href="fwords.html">Dateien</a></div>
<div xmlns="" class="menuItem"><a href="assoz.html">Assoziative Container</a></div>
<div xmlns="" class="menuLabel">Multithreading</div>
<div xmlns="" class="menuItem"><a href="threads1.html">Einführung</a></div>
<div xmlns="" class="menuItem"><a href="threads2.html">JThreads/C++</a></div>
<div xmlns="" class="menuLabel">Inter Process Communication (IPC)</div>
<div xmlns="" class="menuItem"><a href="pipe.html">Pipes</a></div>
<div xmlns="" class="menuItem"><a href="memlock.html">Synchronisation</a></div>
<div xmlns="" class="menuItem"><a href="memmap.html">Memory Mapped Files</a></div>
<div xmlns="" class="menuItem"><a href="httpget.html">Netzwerk Client</a></div>
<div xmlns="" class="menuItem"><a href="httpserv.html">Netzwerk Server</a></div>
<div xmlns="" class="menuItem"><a href="network3.html">Netzwerk 3</a></div>
<div xmlns="" class="menuLabel">CORBA</div>
<div xmlns="" class="menuItem"><a href="../corbatut.html">CORBA</a></div>
<div xmlns="" class="menuLabel">Libraries und APIs</div>
<div xmlns="" class="menuItem"><a href="dirlist.html">Verzeichnisse</a></div>
<div xmlns="" class="menuItem"><a href="environ.html">Programmumgebung</a></div>
<div xmlns="" class="menuItem"><a href="c++boost.html">C++ Boost</a></div>
<div xmlns="" class="menuItem"><a href="dates.html">Zeitrechnungen</a></div>
<div xmlns="" class="menuItem"><a href="locale.html">Around The World</a></div>
<div xmlns="" class="menuItem"><a href="timeover.html">9. September?</a></div>
<div xmlns="" class="menuItem"><a href="regex.html">Reguläre Ausdrücke</a></div>
<div xmlns="" class="menuItem"><a href="random.html">Zufallszahlen</a></div>
<div xmlns="" class="menuItem"><a href="gmp.html">Rechnen mit beliebiger Genauigkeit</a></div>
<div xmlns="" class="menuItem"><a href="macaddr.html">MAC Adresse</a></div>
<div xmlns="" class="menuLabel">Compiler, Debugger, IDEs</div>
<div xmlns="" class="menuItem"><a href="cdt.html">Eclipse CDT</a></div>
<div xmlns="" class="menuItem"><a href="devcpp.html">Bloodshed Dev-C++</a></div>
<div xmlns="" class="menuItem"><a href="bcc32.html">Borland C++ Compiler</a></div>
<div xmlns="" class="menuItem"><a href="cygwin.html">cygwin</a></div>
<div xmlns="" class="menuItem"><a href="lcc.html">LCC-Win32</a></div>
<div xmlns="" class="menuItem"><a href="memwatch.html">Speicherkontrolle</a></div>
<div xmlns="" class="menuLabel">Versionsverwaltung</div>
<div xmlns="" class="menuItem"><a href="rcs.html">Versionsverwaltung</a></div>
<div xmlns="" class="menuItem"><a href="cvs.html">Versionsverwaltung II</a></div>
<div xmlns="" class="menuLabel">Rezensionen</div>
<div xmlns="" class="menuItem"><a href="chowto-c-programmmieren.html">C-HowTo</a></div>
<div xmlns="" class="menuItem"><a href="rez_dpe.html">Design Patterns Explained</a></div>
<div xmlns="" class="menuItem"><a href="rez_willms.html">C++ Programmierung von A. Willms</a></div>
<div xmlns="" class="menuItem"><a href="galileo-c.html">Ein Lehrbuch zu C und C++</a></div>
<div xmlns="" class="menuItem"><a href="csharpbook.html">Das C# Buch von Eric Gunnerson</a></div>
</div>
</body>
</html>

HEADER-CODE:


HTTP/1.1 200 OK
Date: Thu, 25 Jun 2020 22:09:28 GMT
Server: Apache
Last-Modified: Sat, 11 May 2019 16:29:20 GMT
ETag: "3a5e-5889f2f74de8a"
Accept-Ranges: bytes
Content-Length: 14942
Vary: Accept-Encoding
Connection: close
Content-Type: text/html


IP 178.254.22.103 www.kompf.de

Website:www.kompf.de
IP:178.254.22.103
County:DE Germany
Region:BE Land Berlin
City:10555 Berlin
Timezone:Europe/Berlin
html
html5
CSS
CSS3
CSS GRID
Java
EROPA - What does EROPA stand for? The Free Dictionary | UserPages · Wiki · Mutt Project / mutt · GitLab | https://uses.plantnet-project.org/en/Aleurites_moluccana_%28PROSEA%29 | 301 Moved Permanently | Connie Sellecca – Wikipedia | Stiftung | Kulturstiftung des Bundes | Begge Peder Tickets - alle Termine auf einen Blick - Karten online bestellen - Reservix - dein Ticketportal | https://en.wikipedia.org/wiki/2020_coronavirus_pandemic_in_Belarus | https://entfernen-von-spyware.blogspot.com/2020/06/losung-fur-entfernen-searchtopic.html | Redbubble logo | https://www2.cs.arizona.edu/classes/cs210/fall17/sections/MyQueue.java | https://www.facebook.com/ExperiencePlastipak/ | J. Mark Erbaugh, Ph.D. | International Programs in Agriculture | Eunomius | Greek bishop | Britannica | Bausch + Lomb SofLens 59 6 St. ab 7,20 € im Preisvergleich! | RESTAURANT KHUJUG, Zürich - Langstrasse - Menü, Preise & Restaurant Bewertungen - Tripadvisor