# [C++] String anhand einer Zeichenkombination trennen



## kOa_DrohhyN_ (22. April 2005)

Hallo !

Ich bin neu im Bereich C++, kann aber schon PHP und hab deshalb keine Probleme mit Programmierung an sich.
Benutze als Editor Proton und als Compiler g++ unter cygwin (Linux emulator).

Jetzt habe ich folgendes Problem: ich möchte einen string von der Tastatur einlesen und ihn dann anhand einer bestimmten Zeilenfolge trennen - die verschiedenen Abschnitte sollen danach in einen vector, also etwa so:

string txt;
txt = "Ein Text*-*zweiter Textteil ist länger*-*letzter Teil";

Jetzt soll txt anhand der Zeichenfolge *-* in 3 Teile geteilt werden und dann in vector<string> teile(3) "eingelesen" werden, wobei der erste Teil natürlich den Index 0 haben soll usw. Am besten wird die Anzahl der im vector enthaltenen Elemente auch gleich ausgelesen, also vorkommen des Trennzeichens+1.
In PHP könnte ich das einfach mit "explode" machen, hab in C++ aber leider nichts ähnliches gefunden...

Danke im Voraus für Hilfe !


----------



## Tobias K. (22. April 2005)

moin


Habe mal ein bischen rumprobiert:

```
string text="Trenn1*-*uns2*-*Trenn3*-*uns4";
string teile[4];

int anfang[20];
int ende[20];
int l=0;

anfang[0]=0;

for(int i=0; i<text.length(); i++)
{
	if( text[i] == '*' &&
		text[i+1] == '-' &&
		text[i+2] == '*')
	{
		ende[l]=i;
		anfang[++l]=i+3;

		teile[l-1] = text.substr(anfang[l-1], ende[l-1] - anfang[l-1]);
	}
}
teile[l] = text.substr(anfang[l], ende[l] - anfang[l]);
```


mfg
umbrasaxum


----------



## thooomy (25. April 2005)

wenn du keine strings sondern char-arrays verwendest,
kannst du dir auch mal die Funktion sscanf() näher ansehen. 
Die kann das auch, is aber - wie ich auch festellen musste  - etwas mit vorsicht zu geniessen.


----------



## rockbaer (25. April 2005)

oder so :


```
void split(string& text, string& separators, vector<string>& words)
{
	int n = text.length();
	int start, stop;

	start = text.find_first_not_of(separators);
	while ((start >= 0) && (start < n)) 
	{
		stop = text.find_first_of(separators, start);
		if ((stop < 0) || (stop > n)) stop = n;
		words.push_back(text.substr(start, stop - start));
		start = text.find_first_not_of(separators, stop+1);
	}
}
```


----------

