![]() |
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:35 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