5. Strings auftrennen/splitten
Strings-splitten-doppelpunkt.cpp
// Strings-auftrennen/splitten mit Doppelpunkten

# include <string>
# include <iostream>

using namespace std;

int main()
{
string worte="eins:zweierlei:dreimal:vierzehn";
int pos;
int lastpos;
string einzeln[4];
int i,z;

z=0;
lastpos=0;
while(pos!=string::npos)
{
z++;
pos=worte.find(":",lastpos);
einzeln[z]=worte.substr(lastpos,pos-lastpos);
lastpos=pos+1;
}

for(i=1;i<=z;i++)
{
cout << i << ". Wort: " << einzeln[i] << endl;
}

return(0);
}

Die wichtigsten Befehle im Detail:

Das Programm teilt den String worte anhand der Doppelpunkte und schreibt die daraus entstehenden Strings in ein String-Array. Es bedient sich dazu der String-Klasse find um die Positionen der Doppelpunkte innerhalb des Strings zu bestimmen.

while(pos!=string::npos)
Die while-Schleife wird solange ausgeführt, bis die Variable pos am Ende des Strings angekommen ist (npos=null position).
pos=worte.find(":",lastpos);
einzeln[z]=worte.substr(lastpos,pos-lastpos);
lastpos=pos+1;

Mittels find wird das nächste Vorkommen der Doppelpunkte gesucht. Das Nächste deshalb, weil hinter der Angabe des Suchkriteriums ein Wert angegeben ist. find sucht damit erst ab dieser Position nach dem Vorkommen des Suchbegriffs, in unserem Fall beginnt find bei 0 (lastpos=0). Mittels substr wird der entsprechende Begriff zwischen den Doppelpunkten ausgeschnitten, wobei sich die Positionsangabe von substr aus (position,länge) zusammensetzt. Würden die Doppelpunkte schon am Anfang des Strings vorkommen, muß man lastpos auf 1 setzen, eben die letzte Position des gesuchten Trenners. Tut man dies nicht, bricht das Programm mit der Fehlermeldung "std::out_of_range" ab.

Hat man Leerzeichen als Trenner sieht es ein wenig einfacher aus, da man sich eines stringstreams bedienen kann, welcher von Haus aus Leerzeichen als Trenner verwendet. Zum Beispiel:

Strings-splitten-leerzeichen.cpp
// Strings mittels Leerzeichen auftrennen/splitten

# include <string>
# include <sstream>
# include <iostream>

using namespace std;

int main()
{
string worte="eins zweierlei dreimal vierzehn";
string einzeln[4];
int i,z;

z=0;
istringstream uebergabe(worte);
while(uebergabe >> einzeln[z])
{
z++;
}

for(i=0;i<z;i++)
{
cout << i+1 << ". Wort: " << einzeln[i] << endl;
}

return(0);
}
Natürlich kann man mittels des stringstreams den String gleich in Variablen mit unterschiedlichen Datentypen zerlegen. Wie in diesem Beispiel:
Strings-splitten-leerzeichen2.cpp
// Strings mittels Leerzeichen auftrennen/splitten - in einzelne Variablen

# include <string>
# include <sstream>
# include <iostream>

using namespace std;

int main()
{
string satz="Max Mustermann war 10 Jahre lang Abteilungsleiter";
string vorname,nachname;
string position;
int dauer;
string zeitbegriff;
string dm;     // Datenmüll - wird nicht gebraucht

istringstream temp1(satz);
temp1 >> vorname >> nachname >> dm >> dauer >> zeitbegriff >> dm >> position;

cout << "Name: " << vorname << " " << nachname << endl;
cout << "Dauer: " << dauer << " " << zeitbegriff << endl;
cout << "Position: " << position << endl;

return(0);
}
Etwas kniffliger wird es, wenn die auszuschneidenden Strings in Anführungsstriche eingefaßt sind, denn dann hat man in dem Sinne zwei Zeichen, eines links und eines rechts, nach denen man suchen muß. Also müssen wir unser Programm um eine weitere Positions-Variable erweitern:
Strings-splitten-quotes.cpp
// Strings mittels Anführungsstriche auftrennen/splitten

# include <string>
# include <iostream>

using namespace std;

int main()
{
string worte="\"eins\"\"zweierlei\"\"dreimal\"\"vierzehn\"";
string einzeln[5];
int pos1,pos2,lastpos;
int i,z;

z=0;
pos1=0;
lastpos=0;
while(pos1!=string::npos)
{
z++;
pos1=worte.find("\"",lastpos);
lastpos=pos1+1;
pos2=worte.find("\"",lastpos);
lastpos=pos2+1;
einzeln[z]=worte.substr((pos1+1),(pos2-pos1-1));
}

for(i=1;i<z;i++)
{
cout << i << ". Wort: " << einzeln[i] << endl;
}

return(0);
}
 
Index