AnsiString.Pos
-
Hallo,
wie kann man denn die Position des 2. ":" aus diesem String
"Werte123:12:456" herausbekommen. Soweit ich .Pos verstehe ist da immer nur
der erste : zu finden.danke
-
Hallo,
Du könntest den Teil bis zum ersten : mit Delete löschen und dann noch einmal suchen. Du könntest auch statt AnsiString std::string nehmen, da kann man nämlich die Startposition zum suchen bestimmen.
std::string text("Werte123:12:456"); size_t pos = text.find(":"); if( pos != std::string::npos ) pos = text.find(":", pos+1);
-
Das geht ja schnell!
Auf die erste Lösung hätte ich ja echt selbst kommen können.
Die 2. gefällt mir aber besser.Vielen Dank Braunstein
-
Oder aber du nimmst doch AnsiString und nimmst Pos in Verbindung mit SubStr.
-
Hallo
AnsiString::SubString würde aber wieder ein unnötiges Erstellen eines temporären AnsiStrings und damit unnötiges Kopieren von Elementen bedeuten. Mag bei ein paar Zeilen nichts bedeuten aber ist bei Megabyte-großen Dateien entscheidend.
std::string::find ist wirklich die effizienteste Variante.bis bald
akari
-
Dürfte von der Effizienz vergleichbar mit einem Delete sein.
-
Nein.
Außerdem veränderst du deinen Orginalstring. Wenn du das nicht willst, mußt du eben kopieren.
-
Außerdem veränderst du deinen Orginalstring
Öhm Nö.Brauchst du nichts verändern. Verändern tust du den mit einem delete.
-
Ungefähr so:
int i=1; while(--pos) i+=src.SubString(i,src.Length()-i).Pos(":"); src.SubString(i,src.SubString(i,src.Length()-i+1).Pos(":")-1);
-
Ok.Fairerweise die std::string Variante.
int x=-1; while(pos--) x=source.find(sep,x)+1; source.substr(x,source.find(sep,x)-x);
-
Kannst du mir mal verraten, was dein Code bewirken soll?
Wozu dient bei dir das pos? Wo und wie wird es initialisiert? Was soll das substr bewirken, wenn du das Ergebnis nicht speicherst?
-
Hallo
Außerdem sollte die std::string-variante eben nicht mit substr arbeiten sondern an find immer die Position des letzten Fundes übergeben. Dann muß gar nichst mehr kopiert werden.
bis bald
akari
-
also die Lösungen von Braunstein gehen beide, die habe ich auch verstanden und
kann sie auch erweitern.Performance ist bei dem was ich mache sicher noch kein Thema.
Die Lösung von pflox verstehe ich weder noch bekomme ich sie zum Laufen.Gruß
-
Hallo
Wie braunstein schon sagte sind pflox letzte Varianten fehlerhaft.
bis bald
akari
-
akari schrieb:
Hallo
Wie braunstein schon sagte sind pflox letzte Varianten fehlerhaft.
bis bald
akariFalsch.
Nicht fehlerhaft, sondern nur zum verfollständigen.
Soviel Vorstellungsvermögen hätte ich Braunstein und akari eigentlich zugetraut.
Naja.pos ist die Position des durch Trennzeichen getrennten Teilstring aus dem Gesamtstring.
string source="a;b;c;d;"; int pos=2;//2. Position (b) char sep=';'; int x=-1; while(pos--) x=source.find(sep,x)+1; cout << source.substr(x,source.find(sep,x)-x);
-
Das hat nichts mit fehlenden Vorstellungsvermögen zu tu. Code zu posten der nicht funktioniert ist einfach Unsinn. Wenn ein Code zum Denkanstoss dienen soll schreibt man das dazu. Immerhin ist dieser Code nicht für akari und mich gedacht gewesen. Wir können das nämlich schon.
-
Code zu posten der nicht funktioniert ist einfach Unsinn.
Dann sind also der großteil eurer Post's deiner Ansicht nach Unsinn.
Danke für das Gespräch.
-
Eigentlich wollte ich nur was wissen und hier keinen Streit auslösen!
Dennoch interessiert mich der letzte Code auch, aber den bekomme ich auch
nicht kompiliert.
Was für eine string ist das? Wenn ich std::string benutze kann ich kein Edit damit füllen weil stl::string nicht nach AnsiString gewandelt werden kann und wenn ich nur String benutze, gibt es kein 'find'.Vielleicht gib es ja eine friedliche Lösung
-
std::string source="a;b;c;d;"; int pos=2;//2. Position (b) char sep=';'; int x=-1; while(pos--) x=source.find(sep,x)+1; AnsiString wert = source.substr(x,source.find(sep,x)-x).c_str();