AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zeilen in einem String zählen

Ein Thema von lbccaleb · begonnen am 8. Mai 2012 · letzter Beitrag vom 9. Mai 2012
Antwort Antwort
Seite 3 von 3     123   
schöni

Registriert seit: 23. Jan 2005
Ort: Dresden
445 Beiträge
 
Delphi 7 Personal
 
#21

AW: Zeilen in einem String zählen

  Alt 9. Mai 2012, 10:24
Eventuell wird es einfacher/übersichtlicher, wenn du das letzte Inc(P), also das der Schleife, mit in die IFs aufnimmst
Delphi-Quellcode:
while P^ <> #0 do
  if P^ = #13 then begin
    Inc(Result);
    if (P + 1)^ = #10 then
      Inc(P);
    Inc(P); {<<<}  //warum hier dieses zweite Inc(P)?
  end else if P^ = #10 then begin
    Inc(Result);
    Inc(P); {<<<}
  end else
    Inc(P); {<<<}
und dann noch etwas an der Reihenfolge veränderst.
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);
Ich verstehe das 2. Inc(p) nicht.

Delphi-Quellcode:
if (P + 1)^ = #10 then
      Inc(P);
    Inc(P); {<<<} /hier!!!
nach dem ersten Inc(p) steht doch der Stringzeiger bereits auf dem ersten Zeichen der neuen Zeile.
Damit der Topf nicht explodiert, lässt man es ab und zu mal zischen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.051 Beiträge
 
Delphi 12 Athens
 
#22

AW: Zeilen in einem String zählen

  Alt 9. Mai 2012, 10:28
Das zweite Inc(P) gehört zur #13 und das erste zur #10. (darum nochmal die Drehung im zweiten Code)

Delphi-Quellcode:
while P^ <> #0 do
  if P^ = #13 then begin
    Inc(Result);
    if (P + 1)^ = #10 then // nächstes Zeichen
      Inc(P); // #10
    Inc(P); // #13
  end else if P^ = #10 then begin
    Inc(Result);
    Inc(P); // #10
  end else
    Inc(P); // Rest


while P^ <> #0 do
  if P^ = #13 then begin
    Inc(Result);
    Inc(P); // #13
    if P^ = #10 then
      Inc(P); // #10
  end else if P^ = #10 then begin
    Inc(Result);
    Inc(P); // #10
  end else
    Inc(P); // Rest
Letzteres ist also die direkte/ursprüngliche Funktionsweise und beim ursprünglichen Code wurde das alles in einen etwas kürzeren Code optimiert.
Dieses Erste entspricht von der Funktion dem Urspungscode, nur daß ursprünglich eben die dreifachen Inc(P) zu Einem zusammengefast und aus den IFs rausgeholt waren.



Früher war #13#10 der Zeilenumbruch (kennt man vorallem von den Druckern ... CR/CarriageReturn/#13 zurück zum Zeilenanfang + LF/LineFeed/#10 zur nächsten Zeile)
Windows macht das standardmäßig immernoch so.

Linux wollte sparen, drum nutzen die standardmäßig nur noch #10, wo implizit das Carriage Return mit enthalten ist.

Macintosh kochte sein eigenes Süppchen und dachte sich #13 wäre auch ein guter Zeilenwechsel, obwohl das syntaktisch nun überhaupt nicht stimmt.

Windows selber unterstützt standardmäßig alles (vorallem #13#10 und #10), aber z.B. im neuen RichEdit-Control v3 hat man totalen Mist gebaut und dort wird das #13 als Zeilenumbruch verwendet (keine Ahnung warum).

#10#13 währe teschnich gesehn auch ein Zeilenumbruch, aber dieses wird als #10 und #13 angesehn, also zwei Zeilenumbrüche.
Vermutlich weil es einfacher zu implementieren war, bzw. bei der implementierung keiner dran gedacht hat (währe aber auch nur ein IF+INC mehr).
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 9. Mai 2012 um 10:36 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.622 Beiträge
 
Delphi 12 Athens
 
#23

AW: Zeilen in einem String zählen

  Alt 9. Mai 2012, 10:32
@schöni:
Zitat:
Delphi-Quellcode:
if P^ = #13 then begin
    Inc(Result);
    if (P + 1)^ = #10 then //wir stehen hier noch auf #13
      Inc(P); //jetzt auf #10
    Inc(P); //und jetzt erst auf der neuen Zeile
  end
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#24

AW: Zeilen in einem String zählen

  Alt 9. Mai 2012, 10:44
Ganz einfach einfach!

Entweder ist es #10 oder #13 oder #13#10, aber nie gemischt, also einfach einfach machen.

Und noch was, auch Str := '' ist eine Zeile!
Delphi-Quellcode:
function CRLFCount(Str: String): Integer;
var
  cl: Char;
begin
  Result := 1;

  cl := #10;
  if Pos(cl, Str) = 0 then cl := #13;

  while Pos(cl, Str) > 0 do
  begin
    Inc(Result);
    Delete(Str, 1, Pos(cl, Str) + 1);
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  s: String;
begin
  s := 'aaa' + #13#10 + 'aaa' + #13#10 + 'aaa' + #13#10 + 'aaa';

  ShowMessage(IntToStr(CRLFCount(s)))
end;
  Mit Zitat antworten Zitat
UliBru

Registriert seit: 10. Mai 2010
155 Beiträge
 
Delphi 11 Alexandria
 
#25

AW: Zeilen in einem String zählen

  Alt 9. Mai 2012, 10:46
Früher war #13#10 der Zeilenumbruch (kennt man vorallem von den Druckern ... CR/CarriageReturn/#13 zurück zum Zeilenanfang + LF/LineFeed/#10 zur nächsten Zeile)
Windows macht das standardmäßig immernoch so.
Ist das nicht auch heute bei einer Konsolenausgabe nach wie vor gültig?
Er wollte so richtig in Delphi einsteigen. Nun steckt er ganz tief drin ...
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#26

AW: Zeilen in einem String zählen

  Alt 9. Mai 2012, 10:47
Eine kleine Änderung:
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 begin
    case s[i] of
      #13: Inc(Result);
      #10: if not PrevCR then
            Inc(Result);
    end;
    PrevCR := s[i]=#13;
  end;
end;
Gruß
K-H

Das mit dem CarriageReturn und Linefeed sollte man ganz wörtlich nehmen.
mit #13 #10 #10 #10 kann man auf der Konsole, und bei den meisten Druckern 2 Leerzeilen erzeugen.
Wenn das Gerät sich auf die Interpretation der ASCII-Zeichen einläßt!
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 ( 9. Mai 2012 um 10:56 Uhr) Grund: Erweiterung
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.622 Beiträge
 
Delphi 12 Athens
 
#27

AW: Zeilen in einem String zählen

  Alt 9. Mai 2012, 10:48
Danke, mich hat die doppelte Zuweisung auch gestört
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.051 Beiträge
 
Delphi 12 Athens
 
#28

AW: Zeilen in einem String zählen

  Alt 9. Mai 2012, 10:51
Zitat:
Ist das nicht auch heute bei einer Konsolenausgabe nach wie vor gültig?
Joar.

Zitat:
Ganz einfach einfach!

Entweder ist es #10 oder #13 oder #13#10, aber nie gemischt, also einfach einfach machen.
Ja, das währe eine Wunschvorstellung, aber wenn man Strings concateniert, dann kann es schonmal passieren, daß eine Vermischung stattfindet, was leider nicht selten vorkommt.

Aber OK, dann müßte die Funktion aber vorher schauen welcher Zeilenumbruch verwendet wurde und dann eine entsprechende Such-/Zählfunktion ausführen,
oder man sagt der Funktion was vermutlich verwendet wurde oder man bastelt sich mehrere Funktion (oder nur die Eine grade nötige) und ruft jeweils die vermutlich Entsprechende auf.
Oder die Funktion kennt gleich alles und ihr ist es egal, was man reingibt.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz