![]() |
Anzahl eines Zeichens im String ermitteln
Wie kann man die Anzahl eines Zeichens in einem vorliegenden String ermitteln ? Die Pos-Funktion sucht ja nur das erste Zeichen.
Gibt es dafür eine spezielle Funktion, oder muss ich etwa den String in eine temporäre Variable kopieren und nach jedem gefundenen Pos-Ergebnis das Zeichen in dieser Temp-Variable löschen (in einer Schleife) ? |
Re: Anzahl eines Zeichens im String ermitteln
Delphi-Quellcode:
Length(myString)
|
Re: Anzahl eines Zeichens im String ermitteln
Delphi-Quellcode:
es wird einfach zeichen fuer zeichen verglichen. in j findest du dann die anzahl der zeichen
var
i: LongInt; j: LongInt = 0; begin for i := 1 to length(str) do if str[i] = zeichen then Inc(j); //edit die funktion dazu:
Delphi-Quellcode:
function miep(const s: String; c: Char): LongInt;
var i: LongInt; begin result := 0; for i := 1 to length(s) do if s[i] = c then Inc(result); end; |
Re: Anzahl eines Zeichens im String ermitteln
Man könnte es auch mit PosEx() machen
|
Re: Anzahl eines Zeichens im String ermitteln
Zitat:
|
Re: Anzahl eines Zeichens im String ermitteln
Zitat:
|
Re: Anzahl eines Zeichens im String ermitteln
Ich hab zwar grad kein Delphi zur verfügung, aber ich denke dass PosEx nichts anderes macht als den String durchzugehen. Dann kann man sich die mehrfachen Aufrufe auch gleich sparen und per Hand zählen.
|
Re: Anzahl eines Zeichens im String ermitteln
Dann wäre es schlimmstenfalls genauso ineffektiv.
|
Re: Anzahl eines Zeichens im String ermitteln
Also ich habe jetzt eine eigene Funktion geschrieben, die in einer For-To-Do-Schleife (danke @1234588) den String durchsucht.
Ich habe gerade aber auch ein Beispiel mit PosEx ![]() |
Re: Anzahl eines Zeichens im String ermitteln
Geht sogar als Einzeiler:
Delphi-Quellcode:
z:=Length(str)-Length(StringReplace(str, c, '', [rfReplaceAll]))
|
Re: Anzahl eines Zeichens im String ermitteln
Zitat:
|
Re: Anzahl eines Zeichens im String ermitteln
Zitat:
Jungs, es ist immerwieder unglaublich, wie man krampfhaft eine simple Frage unglaublich aufblähen kann :roll: |
Re: Anzahl eines Zeichens im String ermitteln
Moin,
Zitat:
Delphi-Quellcode:
Freundliche Grüße
function Occurs(const s: string; c: Char): Cardinal;
var n: Cardinal; begin Result := 0; for n := 1 to Length(s) do Inc(Result, Ord(s[n] = c); end; |
Re: Anzahl eines Zeichens im String ermitteln
'ne andere Version in die runde geb
Delphi-Quellcode:
function cCount(str: string; c: char): integer;
var x: char; begin result := 0; for x in str do if x = c then inc(result); end; |
Re: Anzahl eines Zeichens im String ermitteln
Delphi-Quellcode:
Ein IF und das Ganze ist 4x schneller (String mit zufälligen Großbuchstaben füllen, nach 'A' suchen).
...
Inc(Result, Ord(s[n] = c); ...
Delphi-Quellcode:
Function IFCount (Const s : String; c : Char) : Integer;
Var i : Integer; Begin Result := 0; For i:=1 to length(s) do If s[i]=c then inc (Result); End; |
Re: Anzahl eines Zeichens im String ermitteln
???
An Position Null wird die Länge gespeichert, Abfrage also
Delphi-Quellcode:
var
s : string; begin s := "Wir gewinnen das Finale"; case s[0] of 1 : begin end; else : s := s + " am Sonntag!"; end; end; |
Re: Anzahl eines Zeichens im String ermitteln
Du hast wohl zu lange mit reinem Pascal programmiert. In Delphi ist der Standard-String-Type zur Zeit Ansistring und nicht Shortstring. In Ansistrings wird die Länge nicht mehr im ersten Byte gespeichert, sondern liegt in den vier Byte vor dem eigentlichen String. Das Ansprechen von s[0] führt daher zu einem Compiler-Fehler.
Außerdem hat das nichts mit der Frage zu tun. |
Re: Anzahl eines Zeichens im String ermitteln
Stimmt, mit der Frage hat es nichts zu tun :oops:
|
AW: Anzahl eines Zeichens im String ermitteln
Delphi-Quellcode:
@Ydobon:
z:=Length(str)-Length(StringReplace(str, c, '', [rfReplaceAll]))
das ist genial (auch nach 10 Jahren noch) 8-) |
AW: Anzahl eines Zeichens im String ermitteln
Vom Code her ja, aber von der Ausführungsgeschwindigkeit und vom Speichermanagement her ist es schon ein bisschen grausam.
> eine "nur lese"-Funktion, die daber sehr oft schreibend im Speicher rumpfuscht Es geht aber inzwischen noch kürzer
Delphi-Quellcode:
Gut, da ist dann noch ein CALL mehr drin, aber der fällt nun auch nicht mehr auf.
z := Length(str) - Length(StringReplace(str, c, '', [rfReplaceAll]));
z := Length(str) - Length(ReplaceStr(str, c, '')); * aus dem Char "c" einen String machen (Speicher reservieren) * im StringReplace einen neuen String erstellen und in dem uneffektiv rumfummeln (StringReplace ist nicht grade effektiv geschrieben, also alles umkopieren nach jedem einzelnen ersetzten Char) * im Delphi zählen die Length wenigstens nicht die Chars, sondern lesen nur die Längenangabe der String aus, aber wollen wir das nicht mit ![]() * die Strings wieder freigeben * und in älternen Delphi (vor D2006) macht es noch mehr Spaß ... kein FastMM (im langsamen alten Delphi-MemoryManager) ... ohne FastCode (wobei hier StringReplace eh nicht das Schnellste bekommen hat) Aber da RegEx sowieso das Coolste hier, hier auch noch eine Lösung damit :stupid:
Delphi-Quellcode:
z := TRegEx.Match(str, c).Groups.Count;
// falls C eines der RegEx-Controlzeichen sein könnte, sollte man es vielleicht besser noch escapen z := TRegEx.Match(str, Format('\x%.2x', [Ord(c)])).Groups.Count; |
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
Delphi-Quellcode:
N := MyString.CountChar(MyChar);
|
AW: Anzahl eines Zeichens im String ermitteln
Du hast zu früh geantwortet und jetzt DIE Megalösung übesehn, welche ich noch nachgetragen hatte. :cry:
|
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
|
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
|
AW: Anzahl eines Zeichens im String ermitteln
Danke für instant-Antwort! Schade dann bleibts bei der langsamen Version für D2009 da Strings bei mir auch noch keine Eigenen Funktionen besitzen.
|
AW: Anzahl eines Zeichens im String ermitteln
Hier der Backport von
Delphi-Quellcode:
für ältere Delphi-Versionen - sollte bekannt vorkommen (miep)...
string.CountChar
Delphi-Quellcode:
function StringCountChar(const S: string; const C: Char): Integer;
var I: Integer; begin Result := 0; for I:= 1 to Length(S) do if S[I] = C then Inc(Result); end; |
AW: Anzahl eines Zeichens im String ermitteln
Ich nutze etwas ähnliches, hier mein Code um noch eine Variante zu zeigen (oder gabs die hier schon?):
Delphi-Quellcode:
function CountCharInString(const Str: String; const c: Char): Integer;
var p: PChar; begin Result := 0; p := PChar(Pointer(Str)); while p <> nil do begin p := StrScan(p, c); if p <> nil then begin inc(Result); inc(p); end; end; end; |
AW: Anzahl eines Zeichens im String ermitteln
@KodeZwerg
Ich glaube Du solltest Dich von Deiner Version verabschieden Zitat:
Delphi-Quellcode:
function AnsiStrScan(Str: PAnsiChar; Chr: AnsiChar): PAnsiChar;
Zitat:
Was auch immer international bedeutet, Uwes Version sollte immer funktionieren. Gruß K-H |
AW: Anzahl eines Zeichens im String ermitteln
Hier aus meiner Delphi-Hilfe, da stand noch nichts vonwegen veraltet aber ich respektiere das und werde das mal updaten, Danke für den Hinweis:thumb:
Delphi-Quellcode:
RAD Studio VCL Referenz
SysUtils.StrScan Funktion Beschreibung | Siehe auch Alles schließenGibt einen Zeiger auf das erste Vorkommen eines bestimmten Zeichens in einem String zurück. Pascal function StrScan(const Str: PAnsiChar; Chr: AnsiChar): PAnsiChar; overload; function StrScan(const Str: PWideChar; Chr: WideChar): PWideChar; overload; C++ PAnsiChar StrScan(const PAnsiChar Str, AnsiChar Chr); PWideChar StrScan(const PWideChar Str, WideChar Chr); Datei SysUtils Beschreibung StrScan gibt einen Zeiger auf das erste Vorkommen des Zeichens Chr im String Str zurück. Ist Chr nicht in Str enthalten, gibt die Funktion nil (Delphi) bzw. NULL (C++) zurück. Das Terminierungszeichen wird als Teil des Strings betrachtet. Anmerkung: Enthält der Quellstring internationale Zeichen, verwenden Sie stattdessen AnsiStrScan. C++ Examples: /* The following example uses an edit control and a button on a form. When the button is clicked, the text in the edit control is searched for a wildcard (asterisk character). */ void __fastcall TForm1::Button1Click(TObject *Sender) { if (StrScan(Edit1->Text.c_str(), '*')) ShowMessage("Wildcard found."); else ShowMessage("Wildcard not found."); } Delphi Examples: { The following example uses a button on a form. When the button is clicked, the text is searched for a wildcard (asterisk character). } function HasWildcards(FileName: PChar): Boolean; { Return true if file name has wildcards in it } begin HasWildcards := (StrScan(FileName, '*') <> nil) or (StrScan(FileName, '?') <> nil); end; procedure TForm1.Button1Click(Sender: TObject); const P: PChar = 'C:\Test.* '; begin if HasWildcards(P) then ShowMessage('The string has wildcards') else ShowMessage('The string does not have wildcards'); end; Siehe auch AnsiStrScan StrRScan |
AW: Anzahl eines Zeichens im String ermitteln
Delphi-Quellcode:
Habs gerade mit normalen Strings getestet, funktioniert immer noch (Sau-)schnell.
function CharInStringA(const Str: AnsiString; const c: AnsiChar): Integer;
var p: PAnsiChar; begin Result := 0; p := PAnsiChar(Pointer(Str)); while p <> nil do begin p := AnsiStrScan(p, c); if p <> nil then begin inc(Result); inc(p); end; end; end; |
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
|
AW: Anzahl eines Zeichens im String ermitteln
Danke für diese Information.
BTW Wie findet ihr die Variante mit (Ansi-)StrScan ? Gut oder doof? |
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
Zitat:
|
AW: Anzahl eines Zeichens im String ermitteln
Ich hatte es nur einmal gebencht (die StrScan nicht AnsiStrScan), Jahrzehnte her, da gewann im Benchmark immer die StrScan vs ForToLength. Je Länger der InputString umso deutlicher wurde das Ergebnis. Ich schau mal ob ich einen Benchmark bastel und stell den dann gerne hier vor, ich werde alle Varianten aus diesem Thread darin antreten lassen, implementieren kann ich allerdings nur Methoden die ich mit D2009 auch umsetzen kann, dann Wissen wirs exakter :idea:
Ps: Es ist nur eine Schleife bei mir. |
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
Wenn die For-Schleife denn unbedingt vermieden werden soll, kann man es auch so machen:
Delphi-Quellcode:
function CharCount(const S: string; const C: Char): Integer;
var N: Integer; P: PChar; begin N := 0; P := PChar(S[1]); while P^ <> #0 do begin if P^ = C then Inc(N); Inc(P); end; Result := N; end; |
AW: Anzahl eines Zeichens im String ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
Anbei ein Benchmark Source-Only Projekt.
Eindeutiger Gewinner = StrScan() Eindeutiger Verlierer = Ydobon mit
Delphi-Quellcode:
.
x := Length(Data)-Length(StringReplace(Data, 'X', '', [rfReplaceAll]))
Am zweitbesten schneidet bei mir alzaimar mit IFCount(Data, 'X'), respekt dafür:thumb::thumb: Dahinter alles andere, schlusslicht bei den normalen Methoden ist AnsiStrScan(). @Uwe, Dein letzter Code löst bei mir bei Aufruf eine Exception aus, der Code ist bereits enthalten, nur in der Mausklick Procedure rausgeklammert. |
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
Delphi-Quellcode:
heißen.
P := PChar(S);
|
AW: Anzahl eines Zeichens im String ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
Dein letzter Code führt damit die Rangliste an!! Grandioses Ergebnis, schlägt alles um Längen:thumb::thumb:
Tut mir leid, da muss wohl mein Rechner noch an was gewerkelt haben als ich es testete. StrScan() immer noch #1 aber total dicht dahinter ist Dein Code (@Uwe), im Grunde teilen die sich die Pole-Position. Im Anhang aktualisiert Fassung, das StringReplace ist rauskommentiert deswegen immer 0 Nanosekunden. Fenster ist nun sizeable, Memo ist AlignClient. Ein Kompilat zum sofort Testen ist enthalten. |
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
|
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz