std::string parsen -> wie?

ich schreibe dies weil ich mittlerweile vollkommen verzweifelt bin:
ich schaffe es nicht einen string zu parsen und jeder der mir (woanders) helfen will hat nur
funktionen die vektoren(?) oder ähnliches zurückliefern.

eigentlich ganz einfach; ich will einen std::string (KEIN char* etc), der im format
Code:
teil_1|teil_2;
vorliegt am "|" teilen und ihn in 2 anderen strings speichern. nun mein problem: wie schaffe ich das ?(

internet half mir wenig, dort steht nur beschrieben wie ich char* parsen kann. und den string über index anzusprechen führt zu überläufen. :(

bin für jede hilfe dankbar
bad_alloc
 
Link
Schau mal ganz unten bei "A string tokenizer". Das ist zwar auch mit Rückgabe als vector, aber das kannst dir ja selber umbauen. Ich versteh sowieso nicht was gegen einen vector hast, da stecken ja auch nur deine gesuchten Strings drin.

Gruß odigo
 
Gibt bestimm ne ähnliche Funktion wie explode() in PHP, ansonsten fällt mir spontan das hier ein (quick 'n dirty in C):

Code:
i=0;
while(input[i] != '|') {
   output1[i] = input[i];
   i++;
}
i++;
while(input[i] != '\0') {
  output2[i] = input[i];
  i++;
}
 
@Cyberm@ster:
im zweiten string ist aber immer noch teil_1., da ja bis zum ende und nicht von | bis ; gelesen wird.

hier mein code, sieht da jemand einen fehler?

Code:
string zeile;
	string fremd;
	string deutsch;
	bool flag = 0;
	int i, a, b;

	while (!voc_dat.eof())
	{
		//zeile einlesen
		cin.seekg(0,std::ios::end);
		cin.clear();
		getline(voc_dat, zeile);
		cout << zeile << endl; //DEBUG
		
		//jetzt den string parsen :-!

		i = 0;
		while (zeile[i] != ';')//bearbeitet ganzen string
		{
			a = 0;
			while (zeile[a] != '|') //fremndes einlesen
			{
				fremd[i] = zeile[i];
				++a;
			}
			cout << fremd << endl; //DEBUG

			
			while (zeile[a] != ';') //durchgehen bis if erreicht ist
			{
				b = 0;
				if (zeile[a] == '|') //einlesen beginnen wenn das so ist
				{
					while(zeile[b] != ';')
					{
						deutsch[b] = zeile[b];
						++b;
					}
				}
				++a;
			}
			cout << deutsch << endl;
			++i;
		}
		

		
	}
(soll ein vokabeltreiner werden)
 
Original von Cyberm@ster
Gibt bestimm ne ähnliche Funktion wie explode() in PHP, ansonsten fällt mir spontan das hier ein (quick 'n dirty in C):

Code:
i=0;
while(input[i] != '|') {
   output1[i] = input[i];
   i++;
}
i++;
while(input[i] != '\0') {
  output2[i] = input[i];
  i++;
}

In dem Code da oben brauchst du für die zweite Schleife eine zweite Zählvariable(oder eben die Trennstelle entsprechend abziehen), da du sonst irgendwo in der Mitte des zweiten Strings anfängst zu schreiben.

Code:
while (zeile[i] != ';')//bearbeitet ganzen string
		{
			a = 0;
			while (zeile[a] != '|') //fremndes einlesen
			{
				fremd[i] = zeile[i];
				++a;
			}
			cout << fremd << endl; //DEBUG

			
			while (zeile[a] != ';') //durchgehen bis if erreicht ist
			{
				b = 0;
				if (zeile[a] == '|') //einlesen beginnen wenn das so ist
				{
					while(zeile[b] != ';')
					{
						deutsch[b] = zeile[b];
						++b;
					}
				}
				++a;
			}
			cout << deutsch << endl;
			++i;
		}
Ich verstehe nicht so ganz, was die Konstruktion mit den verschachtelten while-Schleifen soll. Somit gehst du für jeden Buchstaben teilweise die ganze Zeile erneut durch. Cybermasters Code war schon fast richtig:
Code:
int i,j;
for(i=0;zeile[i]!='|';i++) {
fremd[i] = zeile[i];
}
i++; // | ueberspringen
for(j=0;zeile[i]!=';';j++,i++) {
deutsch[j] = zeile[i];
}

@Cyberm@ster:
im zweiten string ist aber immer noch teil_1., da ja bis zum ende und nicht von | bis ; gelesen wird.
Nein. i hat bereits als Wert den Index des ersten Buchstabens nach |, aufgrund der ersten Schleife.

Allgemein würde ich sagen, dass eine Datenbank wie sqlite für diesen Zweck etwas besser geeignet sein könnte.
 
gut das hab ich übersehen, danke!
(von sql verstehe ich nichts)

EDIT: habe cyberm@sters code probiert, VS hat nichts daran auszusetzen, aber wenn ich das programm ausführe ist der string an diese stelle angeblich "out of range"
hier ausgaben vom debugger:

inhalt des strings:" h???????????????" (h ist richtig eingelese worden)
seine größe: 0 (kann das sein?)
Anmerkung: Er wird permanent als <schlechtesPtr> klassifiziert

bin mittlerweile echt ratlos was da schiefgeht. :( weiß jemand rat?
mfg
bad_alloc
 
Zurück
Oben