Position des x-ten Vorkommens eines Teilstrings in einem String

A

ai-gamecock

Hi!
Hab schon gesucht aber nichts gefunden was mir hilft;
wie kann ich aus einem String die Position des x-ten Vorkommens eines Teilstrings (bzw Zeichens) (möglichst als Integer) auslesen?
z.B.: Ich möchte aus diesem String:
String text="1*125152*250178*tree_normal_1*0*0*0**";
die zweite und dritte Zahl auslesen, die Zahlen sind aber Variabel und können daher auch mal kürzer sein als im Beispiel, d.h. text.SubString(3,6) geht nicht immer.
Ich hab schon mal was von find_first_of() oder so gehört, allerdings weis ich nichts über die Anwendung dieses Befehls, der Autor hat gespart und nach meiner Nachfrage nicht mehr geantwortet.
Der Befehl .Find(String,int) geht nur bei Stringlisten (obwohl er meiner Meinung nach ideal wäre), und der Befehl text.Pos(String) liefert nur den ersten oder letzten (mein ich zumindest)
Wer helfen kann, soll dies bitte (möglichst bald) tun! Danke!
 

deepthroat

Erfahrenes Mitglied
Hi.

Die Klasse std::string besitzt eine Methode "find" die einen Substring in einem String findet und die Position zurückgibt. Falls das gesuchte Wort nicht in dem String vorkommt, gibt string::find den speziellen Wert "string::npos" zurück. Der zweite Parameter der Funktion ist ein Offset ab dem die Suche gestartet werden soll.
Code:
size_type find (const string& str, size_type pos=0) const;
size_type find (char ch, size_type pos=0) const;
Beispiel:
Code:
#include <string>

using namespace std;

string str ("cat dog mice cat dog mice cat");

for (int i = str.find ("cat");
      i != string::npos;
      i = str.find (cat, i+1)) {
   /* ... */
}

Diese Methode kann man auch mit einem einzelnen Zeichen aufrufen (denn bei dir scheint ja '*' ein Trennzeichen zu sein, oder?).

Ansonsten findet man auch viele Beispiele für string::find und string::find_first_of, string::find_first_not_of etc. mit Google.
 
A

ai-gamecock

mir scheint du hast meinen Text nicht wirklich gelesen.
wenn ich str.Find hinschreibe, erscheint die Fehlermeldung 'find' is not a member of 'AnsiString', was so viel bedeutet wie: des geht so nicht. Liegt des jetzt am BCB6, an meinem System oder daran, dass es halt nicht geht?
es geht auch nicht, wenn ich
Code:
 #include <string>
using namespace std;
reinschreibe.
und wo soll ich des:
Code:
size_type find (const string& str, size_type pos=0) const;
size_type find (char ch, size_type pos=0) const;
hintippen?
 

deepthroat

Erfahrenes Mitglied
Mein Text bezog sich auf die Standard C++ Bibliothek und die string Klasse die es da gibt. Wenn du was anderes benutzt, mußt du doch eigentlich besser wissen wie du damit umgehen mußt.

Du könntest deinen AnsiString in einen std::string konvertieren und dann die erwähnten Methoden auf diesen String anwenden:
Code:
#include <string>

AnsiString s;
std::string str (s.c_str( ));

int i = str.find( ':' ); /* ... */

Vorausgesetzt dein BCB besitzt den <string> Header.

und wo soll ich des:
Code:
size_type find (const string& str, size_type pos=0) const; size_type find (char ch, size_type pos=0) const;
hintippen?

Nirgendwo. Das sind die Deklarationen für die besprochenen Methoden so wie sie in der string Klasse der Standard C++ Bibliothek stehen. Das hab ich nur zitiert damit du auch genau weißt wie es geschrieben ist. Wie willst du sonst wissen wie du es aufrufen kannst?
 

deepthroat

Erfahrenes Mitglied
OK. Was bei std::string "find" ist, ist bei AnsiString "Pos".

AnsiString str;

int i = str.Pos(":");

Is doch alles ganz einfach. ;)

PS: Haste denn keine Referenz/Handbuch oder sowas?
 
A

ai-gamecock

hallo erstmal
hab ja lang genug auf mich warten lassen^^

erstmal zu deinem PS: nein, ich habe kein handbuch. zumindest nicht wirklich, des einzige was ich hab is "C++ für Kids", nicht schlecht des buch, aber sobalds etwas professioneller wird hilft einem des buch nicht mehr weiter.

und zu allem anderen was geschrieben wurde: ich schaus mir bei gelegenheit an, vorausgesetzt ich mach noch viel mit C++; ich bin mehr oder weniger auf C# umgestiegen.

aber trotzdem danke,
aigc