std::string : suche nur einen bestimmten bereicht begrenzen
-
ich versuche in einer schleife immer zum nächsten eintrag innerhalb eines strings zu springen (das vor dem eintrag an sich ist bekannt z.b. "kundennummer:"). dannach suche ich die position hinter dem eintrag und mittels str.substr(pos1, pos2-pos1) hab ich dann den eintrag selbst. allerdings wird die abbruchbedingung der schleife nie erfüllt da bei str.find() wenn eigentlich kein eitrag mehr kommen sollte immer wieder zum allerersten gesprungen wird. wie kann ich das vermeiden, bzw. die range in der gesucht wird einschränken sodass am sich die position immer mehr an die allerletzte annähert. am ende wird dann zwischen pos1 und endpos gesucht wobei die mittlerweile so nah anneinandergerückt sind das man da nix mehr finden wird.
vielen dank schonmal
-
Hallo
Wenn ich deinen wirren Text richtig verstanden habe, solltest du dir mal die zusätzlichen Parameter von std::string::find anschauen.
bis bald
akari
-
Anfänger_braucht _hilfe schrieb:
ich versuche in einer schleife immer zum nächsten eintrag innerhalb eines strings zu springen (das vor dem eintrag an sich ist bekannt z.b. "kundennummer:"). dannach suche ich die position hinter dem eintrag und mittels str.substr(pos1, pos2-pos1) hab ich dann den eintrag selbst. allerdings wird die abbruchbedingung der schleife nie erfüllt da bei str.find() wenn eigentlich kein eitrag mehr kommen sollte immer wieder zum allerersten gesprungen wird. wie kann ich das vermeiden, bzw. die range in der gesucht wird einschränken sodass am sich die position immer mehr an die allerletzte annähert. am ende wird dann zwischen pos1 und endpos gesucht wobei die mittlerweile so nah anneinandergerückt sind das man da nix mehr finden wird.
vielen dank schonmal
*semantic underflow error*
Vielleicht kann ich dazu was Hilfreiches beitragen, wenn Du den Text so strukturierst, dass es leichter ist, ihn zu entziffern, als das Problem zu lösen. Tipp: Groß/Kleinschreibung, Satzzeichen, Satzstruktur, Absätze.Gruß,
Simon2.
-
Okay der String sieht beispw. so aus:
std::string str("kn:12345 kn:12346 kn:12347 ...");//kn=kundennummerper
int pos=0; pos=str.find("kn:",pos)+std::strlen("kn:");springe ich dann immer zu der jeweiligen nummer. die nummer an sich erhalte ich dann mittels
str.substr(pos, str.find(' ', pos)-pos);(wobei er space als trennzeichen nicht kennt, bei mir steht da ein '\"' aber das ist ein anderes problem). angenommen die länge der kn ist immer 5 dann könnte man die sich ja der reihe nach mit einer schleife ausgeben lassen. wenn allerdings die letzte kn erreicht wurde wird komischerweise immer wieder zu ersten gesprungen. wie kann man das vermeiden? (oder eine andere möglichkeit: wie kann man den suchbereich einschränken? also:)
std::string::find(const char* s, size_t pos1, size_t pos2);so irgendwie sollte das dann aussehen
ich hoffe das hat die sache etwas klarer gemacht

-
und so etwas ähnliches gibt es ja auch, wie in akaris Link zu sehen ist.
-
ich glaub ich hab das problem selbst gefunden: an der schleife war was faul, und zwar konnte die variable pos einen bestimmten wert garnicht überschreiten, da wenn nichts gefunden wurde pos==std::string::npos==-1 war. also konnte die schleife wieder von vorn beginnen.
@ Braunstein: die 4 versionen von std::string::find waren mir bekannt allerdings bezieht sich doch der 3 paramter (lengh) der einen Methode auf den C-string und nicht etwa auf *this oder doch?
-
Anfänger_braucht _hilfe schrieb:
@ Braunstein: die 4 versionen von std::string::find waren mir bekannt allerdings bezieht sich doch der 3 paramter (lengh) der einen Methode auf den C-string und nicht etwa auf *this oder doch?
Falls Du mit "dem C-string" das Suchwort meinst, dessen Länge kann die Standardbibliothek prima selbst ermitteln

-
Der Anfänger hat Recht.

Das length bezieht sich auf die Länge des zu suchenden strings. Die von akari verlinkte Erläuterung habe ich irgendwie anders verstanden aber im Josuttis sowie im Standard selbst steht es natürlich richtig. Im Josuttis steht nochNote that chars must have at least chars_len characters. ...
und imStandard steht noch folgendes zu dieser Variante von find
Returns: find(basic_string<charT,traits,Allocator>(s,n),pos