die anzahl der teilstrings in einer zeichenkette bestimmen
-
hallo,
die überschrift sags eigentlich schon:
ich hab ein ansistring. nun möchte ich wissen, wie oft in ihm ein bestimmter teilstring vorkommt.wie geht das? gibt es dafür schon eine vorgefertigte funktion, die ich noch nicht gefunden hab?
-
Die Vorlage in einen temporären String kopieren, in diesem mit Pos die erste Instanz des gesuchten Strings ermitteln, dann mit Delete diese Instanz sowie alles davor aus dem temporären String löschen, dann das Ganze von vorn, bis zum Ende des Strings. Und das Mitzählen nicht vergessen.
-
Eine ressourcen-verschwenderische aber bequeme Methode wäre es, mit StringReplace und TStrings::CommaText zu arbeiten...
-junix
-
ahja, ok
ich hab mal was probiert:
int CountWrds(AnsiString asString, AnsiString asSubString) { int iCount = 0; int iPos; while((iPos = asString.Pos(asSubString)) > 0) { asString.Delete(iPos, asSubString.Length()); iCount++; } return iCount; }
ist das die schnellste lösung?
-
Auch auf die Gefahr hin mich "unbeliebt" zu machen
Ich würde ungefähr so was preferieren, zuwas progged man schließlich C und nicht Pascal oder Basic
Beispiel:char *p, *pmstr, *ptstr; int counter; AnsiString mainstr="alles scheisse deine elli und nochmal alles scheisse deine elli"; AnsiString teilstr="elli"; pmstr=mainstr.c_str(); ptstr=teilstr.c_str(); for(counter=0; (p=strstr(pmstr, ptstr))!=NULL; counter++, pmstr=p+1); // counter enhält hier die Anzahlo der gefundenen Teistrings
Man beachte, hier werden keine Schreibzugriffe in den AnsiString vorgenommen und Lesen ist ja nicht verboten :p
-
hehe, auch net schlecht
aber was is jetzt schneller bei größeren texten (strings)?das ganze soll nämlich später auf ne datei angewendet werden.
-
Peter schrieb:
Man beachte, hier werden keine Schreibzugriffe in den AnsiString vorgenommen und Lesen ist ja nicht verboten :p
Das ist auch in den seltensten Fällen das Problem. Das Problem ist vielmehr, dass sich der mit c_str() ermittelte Zeiger radikal ändern kann, wenn ein anderer String da reingepackt wird. Ich dachte ich hätte dir das mal erklärt? (o;
-junix
-
@junix
*LOL* Das ist mir schon bewusst, in kritischen Fällen empfiehlt sich deshalb ja auch ein AnsiString::Unique, aber darüber brauchen wir nicht mehr diskutieren. Ich meinte diese Bemerkung ja auch ein wenig ironisch in Bezug auf diesen Thread in welchem ich etwas für "Aufregung" sorgte
-
mmmh ob du mich richtig verstanden hast? Auch der Lesende Zugriff auf einen mit c_str() ermittelten Zeiger ist nicht unkritisch.
-junix
-
.. ich denke zu wissen, was man bei AnsiString und Pointern beachten muß und wann ..
-
Du ja. Aber obs ein Anfänger oder ein fortgeschrittener Anfänger weiss? )o:
-junix
-
Okay, das ist dann ein anderer Aspekt
Aber in meinem Beipiel oben wird es bestimmt keine Probleme geben es sei denn, ich habe noch einen groben logischen Fehler drinnen
-
...oder schlechtes Multithreading... ...oder andere blöden nebeneffekte... oder...
-junix
-
Jou, das könnte aber auch bei einem "normalen" C-String passieren
Aber Du weißt ja selber, es gibt fast nix wwas es nicht gibt