Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   String-Ende mit while finden (https://www.delphipraxis.net/205210-string-ende-mit-while-finden.html)

Caps 12. Aug 2020 14:01

AW: String-Ende mit while finden
 
Ok, dann werde ich vorher auf PChar casten, danke.

himitsu 12. Aug 2020 14:06

AW: String-Ende mit while finden
 
Die Hilfe schreibt inzwischen auch mal mehr zu den früher geheimen Internas.
http://docwiki.embarcadero.com/RADSt...Typen_(Delphi)

Und der geheime Typ StrRec in der System.pas

Caps 12. Aug 2020 14:08

AW: String-Ende mit while finden
 
Danke :)

lg Caps

KodeZwerg 12. Aug 2020 14:18

AW: String-Ende mit while finden
 
Zitat:

Zitat von himitsu (Beitrag 1471701)
Die Hilfe schreibt inzwischen auch mal mehr zu den früher geheimen Internas.
http://docwiki.embarcadero.com/RADSt...Typen_(Delphi)

Und der geheime Typ StrRec in der System.pas

*Knuddel* auf Dich ist immer verlass *Knuddel*

KodeZwerg 12. Aug 2020 14:28

AW: String-Ende mit while finden
 
für akademische zwecke, hier noch ein kurzer link aus dem Jahr 2009/2011.

Delphi.Narium 12. Aug 2020 14:51

AW: String-Ende mit while finden
 
Zitat:

Zitat von Caps (Beitrag 1471697)
Length liefert NICHT die Zeilenumbrüche mit?
Das würde mich jetzt aber aus der Bahn werfen...

Schonmal ausprobiert?
Delphi-Quellcode:
var
  s : String;
begin
  s := '>' + #13#10#13#10#13#10 + '<';
  ShowMessage(Format('%s ist %d Zeichen lang.',[s,Length(s)]));
end;
Was kommt denn dabei jetzt raus?
Code:
---------------------------
Editor
---------------------------
>


< ist 8 Zeichen lang.
---------------------------
OK  
---------------------------

Uwe Raabe 12. Aug 2020 15:13

AW: String-Ende mit while finden
 
Nur nochmal zur Klärung: Strings und AnsiStrings in Delphi enthalten immer ein abschließendes 0-Zeichen. Daher ist eine Umwandlung in PChar bzw. PAnsiChar nicht nötig. Allerdings muss man aufpassen, wenn man den String an diesem Punkt indiziert, da das 0-Byte bzw. 0-Word außerhalb des gültigen Bereichs liegt. Zur Not kann man dann aber die Bereichsprüfung abschalten.

Lange String-Typen

himitsu 12. Aug 2020 15:27

AW: String-Ende mit while finden
 
Ja, es zählt die Zeichen, und sollte ein Zeilenumbruch 2 Zeichen lang sein, dann sind das eben auch 2 Zeichen und nicht 1.
Man darf vorher gern #13#10 durch #10 ersetzen, oder man muß die Zählfunktion anpassen.

Zitat:

Zitat von Uwe Raabe (Beitrag 1471714)
Daher ist eine Umwandlung in PChar bzw. PAnsiChar nicht nötig.

Ja, aber wenn du über S[x] zugreifst und die Indexprüfung aktiv ist, dann raucht es, sobald du auf diese impliziten #0 zugreifen willst.

Caps 13. Aug 2020 09:18

AW: String-Ende mit while finden
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1471709)
Zitat:

Zitat von Caps (Beitrag 1471697)
Length liefert NICHT die Zeilenumbrüche mit?
Das würde mich jetzt aber aus der Bahn werfen...

Schonmal ausprobiert?
Delphi-Quellcode:
var
  s : String;
begin
  s := '>' + #13#10#13#10#13#10 + '<';
  ShowMessage(Format('%s ist %d Zeichen lang.',[s,Length(s)]));
end;
Was kommt denn dabei jetzt raus?
Code:
---------------------------
Editor
---------------------------
>


< ist 8 Zeichen lang.
---------------------------
OK  
---------------------------


Das ist genau das Verhalten, was ich erwarten würde; Length zählt die Umbrüche mit.
Etwas anderes hätte mich gewundert.

lg Caps

himitsu 14. Aug 2020 13:42

AW: String-Ende mit while finden
 
Delphi-Quellcode:
'>'#13#10#13#10#13#10'<' = 8
'>'#10#10#10'<' = 6
'hätte' = 5
'ha'#$0308'tte' = 6
Tja, wenn man die Char's zählt, dann bekommt man eben auch die Anzahl der Chars.

Im Notfall muß man eben vorher den String "normalisieren", wenn man was Anderes haben will.

Denn egal ob ich #13#10 als EINS zähle
oder ob ä und ä (a¨ > Combining Diaeresis) für "mich" das Gleiche sind,
für den Computer ist es das nur dann, wenn ich es ihm sage.



Delphi-Quellcode:
if 'hätte' = 'ha'#$0308'tte' then // das hier schmeißt direkt der Compiler raus
  Sleep(100){False};
S := 'ha'#$0308'tte';
if 'hätte' = S then // ähnlich CompareStringOrdinal
  Sleep(100){False};
if CompareStringOrdinal('hätte', 5, 'ha'#$0308'tte', 6, False) = CSTR_EQUAL then
  Sleep(100){False};
if CompareString(LOCALE_USER_DEFAULT, LINGUISTIC_IGNOREDIACRITIC, 'hätte', 5, 'ha'#$0308'tte', 6) = CSTR_EQUAL then
  Sleep(100){True};
https://www.compart.com/en/unicode/U+0308
https://en.wikipedia.org/wiki/Combining_character


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:51 Uhr.
Seite 3 von 3     123   

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