![]() |
AW: Zeilen in einem String zählen
Also ich finde eine For-Schleife am einfachsten zu lesen.
|
AW: Zeilen in einem String zählen
Ich geb's zu, sowas wie mit der Stringliste nutze sich selber ab und zu.
Denn es ist schön kleiner Code, welcher garantiert funktioniert (Bugs sind so gut wie ausgeschlossen) und wenn es nicht auf die letzte Millisekunde drauf ankommt und wenn der Speicher nicht relevant ist, dann stört es absolut nicht, wenn intern etwas mehr gemacht wird. z.B. für's Anpassen der Zeilenumbrüche, wo dann unter #10, #13 und #13#10 in das passende format konvertiert werden (unter Windows nach #13#10)
Delphi-Quellcode:
S := 'abc'#10'xyz';
with TStringList.Create do try Text := S; S := Text; finally Free; end; // S = 'abc' + sLineBreak + 'xyz'; |
AW: Zeilen in einem String zählen
Was ist denn der Unterschied zwischen den beiden Versionen? ausser das die von himitsu ne ganze Ecke unübersichtlicher ist^^
Zitat:
Zitat:
|
AW: Zeilen in einem String zählen
Leztere zählt nur CRLF (#13#10).
Erstere beachtet #10 (Linux), #13 (Mac) und #13#10 (Windows). Und sieh zählt korrekt. - leerer String = keine Zeile / könnte man aber auch als eine Leerzeile betrachten - kein Zeilenumbruch = 1 Zeile - 1 Zeilenumbruch = 2 Zeilen - 2 Zeilenumbrüche = 3 Zeilen - 3 Zeilenumbrüche = 4 Zeilen - ... Und in Bezug auf die #0, gibt es einen Unterschied. Bei PChar ist dort Schluß, während der Delphi-String theoretisch noch weitergehn könnte. Direkt als String (ohne PChar):
Delphi-Quellcode:
function CountLines(const aString: string): Integer;
var i: Integer; begin if aString <> '' then begin Result := 1; i := 1; while i <= Length(aString) do if aString[i] = #13 then begin Inc(Result); if (i < Length(aString)) and (aString[i + 1] = #10) then Inc(i); end else if aString[i] = #10 then Inc(Result); end else Result := 0; end; |
AW: Zeilen in einem String zählen
@lbccaleb
Die oben schon erwähnte TStringList ist wohl die Einfachste Methode. Text ist ein StringList laden, Count lesen, fertig. Warum nicht die Möglichkeiten von Delphi nutzen wenn sie da sind. Erst wenn es wichtig ist ressourcesparend oder ultraschnell zu arbeiten, könnte man sich was anderes nehmen. |
AW: Zeilen in einem String zählen
Zitat:
Aber nocheinfacher finde ich eigentlich die CountCRLF funktion. Die ist einfach und erfüllt ihren Zweck super :) Das von himitsu ist bestimmt besser, aber da brauch man ne ganze Weile sich da rein zu finden, wenn man sich das ganze selber beigebracht hat....8-) |
AW: Zeilen in einem String zählen
Ich sehe hier eine Ungereimtheit:
In CountLines:
Delphi-Quellcode:
Oder hab ich hier einen Denkfehler?
while P^ <> #0 do begin
if P^ = #13 then begin Inc(Result); //wenn true, dann INC(Zeilenzahl) if (P + 1)^ = #10 then Inc(P); //wenn true, dann INC(StrPos) end else if P^ = #10 then Inc(Result); //wenn true, dann INC(Zeilenzahl) Inc(P); //und hier dann ei 2. Mal INC(StrPos), wenn //if Zweig durchlaufen end; |
AW: Zeilen in einem String zählen
Eventuell wird es einfacher/übersichtlicher, wenn du das letzte Inc(P), also das der Schleife, mit in die IFs aufnimmst
Delphi-Quellcode:
und dann noch etwas an der Reihenfolge veränderst.
while P^ <> #0 do
if P^ = #13 then begin Inc(Result); if (P + 1)^ = #10 then Inc(P); Inc(P); {<<<} end else if P^ = #10 then begin Inc(Result); Inc(P); {<<<} end else Inc(P); {<<<}
Delphi-Quellcode:
while P^ <> #0 do
if P^ = #13 then begin Inc(Result); Inc(P); {<<<} if P^ = #10 then {<<<} Inc(P); end else if P^ = #10 then begin Inc(Result); Inc(P); end else Inc(P); |
AW: Zeilen in einem String zählen
Zitat:
Wäre es nicht ausreichend, anhand eines gefundenen Linefeeds hochzuzählen?
Delphi-Quellcode:
function CountLines(const aString: string): Integer;
var i: Integer; begin if aString <> '' then begin Result := 1; i := 1; while i <= Length(aString) do if aString[i] = #10 then Inc(Result); end else Result := 0; end; |
AW: Zeilen in einem String zählen
Da hab ich auch noch einen ohne Pointer, sollte mit #10, #13 und #13#10 zurechtkommen.
Delphi-Quellcode:
function CountLines(const s: string): integer;
var PrevCR: Boolean; //Previous Carriage Return i: integer; begin Result := 0; PrevCR := false; for i := 1 to Length(s) do case s[i] of #13: begin Inc(Result); PrevCR := true; end; #10: begin if not PrevCR then Inc(Result); PrevCR := false; end; else PrevCR := false; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:25 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