![]() |
String-Ende mit while finden
Hallo,
ich glaube ich stehe auf dem Schlauch. Ich habe nirgends Infos gefunden, womit ein AnsiString nun terminiert wird, oder wo die Länge zu finden ist. Ich würde gern einen String Byte für Byte durchlaufen, aber mit while, bis ich das Ende erreicht habe. Die Frage ist nun, wie ich erkenne, dass ich das Ende erreicht habe(?). Ich möchte nicht zuerst die Länge abfragen und dann den Laufindex damit vergleichen, sondern ich möchte eine Bedingung wissen, wie ich das Ende erkennen kann. Gibt es sowas? lg Caps |
AW: String-Ende mit while finden
Delphi-Quellcode:
so was?
for i := 0 to 65535 do
if ansistr[i] = AnsiChar(#0) then begin break; end; |
AW: String-Ende mit while finden
Hallo,
wie wärs mit length(deinString)
Delphi-Quellcode:
order bei neurem Delphi
var I:Integer
for i:=1 to length(deinString) do irgendwas deinstring.length EDIT: geht nicht mit AnsiString Gruß Matthias |
AW: String-Ende mit while finden
Zitat:
![]() "Die Indizierung von AnsiString beginnt bei 1" |
AW: String-Ende mit while finden
Ich würde das gerne mit while erreichen.
Ich müsste bloß wissen, wie die Bedingung für das Ende lautet. Kann es sein, dass lange Strings doch mit #0 terminiert sind? Gilt dann mein_string [length(mein_string)+1] = #0? Oder gibt es da einen Zugriffsfehler? lg Caps |
AW: String-Ende mit while finden
Zitat:
Nur die Länge 65535 ist zu kurz. Meine Strings sind wesentlich länger. |
AW: String-Ende mit while finden
Delphi-Quellcode:
while AnsiStr[i] <> AnsiChar(#0) do
sorry wg falschem start index vorhin. |
AW: String-Ende mit while finden
Zitat:
|
AW: String-Ende mit while finden
Ok, danke, ich probiere das mit #0.
Das war die Information, die sich in der Delphi-Hilfe ein wenig versteckt ^^. Danke und Grüße! Caps |
AW: String-Ende mit while finden
Delphi-Quellcode:
i:=0
while i<length(ansistr) do begin; inc(i); tu irgendwas mit deinem String end; |
AW: String-Ende mit while finden
Zitat:
|
AW: String-Ende mit while finden
Genau, es ist nur Text.
Und den Aufruf von length wollte ich vermeiden. Wenn lange Strings max. 2GB lang sein können, müsste LongWord als Typ für die Länge reichen, oder? Das war meine anfängliche Sorge... |
AW: String-Ende mit while finden
LongWord/Cardinal wäre passend.
|
AW: String-Ende mit while finden
ShortString (der erste Delphi-String hat im Char [0] sein LängenByte)
LongString im Delphi (String, bzw. AnsiString und Nachfahren ala UTF8String, sowie UnicodeString) und auch der WideString (Interne Weiterleitung zur ![]() gibt es einen Integer vor den Chars (ein Record im negativen Index, mich Length, CodePage, RefereceCount und CharSize) Und nach dem letzten Char gibt es noch implizit zwei #0. #0 als StringEnde wird implitzt für "einfache" Castas zu PChar untersützt, aber der String selber reagiert ausschließlich auf die Längenangabe. Man kann nach PChar casten und APIs ala ![]() Oder wenn man einfach nur abschneiden will, dann die impliziten String-Funktionen für PChar->String nutzen.
Delphi-Quellcode:
S := PChar(S);
Zitat:
Leider auch dann, wenn man für 64 Bit kompiliert. (k.A. warum hier jemand auf diese saudämliche Idee gekommen ist) Ansonsten wäre NativeInt der passende Typ gewesen. :cry: Denn intern ist String eigentlich nur ein aufgemotztes dynamische Array und dessen Length ist als NativeInt deklariert, womit unter 64 Bit diese Typen nicht mehr kompatibel sind. :wall: |
AW: String-Ende mit while finden
Zitat:
|
AW: String-Ende mit while finden
"[...] aber der String selber reagiert ausschließlich auf die Längenangabe [...]"
Aber ich kann doch das while-Konstrukt mit dem Vergleich auf #0 benutzen, oder? Es gibt keinen Zugriffsfehler am Ende? |
AW: String-Ende mit while finden
Zitat:
|
AW: String-Ende mit while finden
Zitat:
"Length(Text)" und "While not #0 inc(i)" Length liefert länge vom text, incremental count liefer zusätzlich auch alles nicht-sichtbare. Beispiel Zeilenumbrüche = 2 bytes |
AW: String-Ende mit while finden
Length liefert NICHT die Zeilenumbrüche mit?
Das würde mich jetzt aber aus der Bahn werfen... |
AW: String-Ende mit while finden
Zitat:
Über einen Cast nach PChar kannst du auch "sicher" zwei 2 Zeichen hinter das String-Ende zugreifen. Ein Leer-String ist eigentlich NIL, aber ![]() PS: Zwei #0 als Ende, weil es im Windows auch ein Art StringList / Array gibt, wo Strings per #0 getrennt sind und das Ende der Liste als #0#0 definiert ist (also ein leerer String '' ist das Ende) Und zusällig wird dieses auch in der Delphi-RTTI verwendet, z.B. für die Namen in Enums. (weswegen man hier auch keine RTTI für Enums bekommt, wo Werte übersprungen werden :cry:) |
AW: String-Ende mit while finden
Ok, dann werde ich vorher auf PChar casten, danke.
|
AW: String-Ende mit while finden
Die Hilfe schreibt inzwischen auch mal mehr zu den früher geheimen Internas.
![]() Und der geheime Typ StrRec in der System.pas |
AW: String-Ende mit while finden
Danke :)
lg Caps |
AW: String-Ende mit while finden
Zitat:
|
AW: String-Ende mit while finden
für akademische zwecke, hier noch ein kurzer
![]() |
AW: String-Ende mit while finden
Zitat:
Delphi-Quellcode:
Was kommt denn dabei jetzt raus?
var
s : String; begin s := '>' + #13#10#13#10#13#10 + '<'; ShowMessage(Format('%s ist %d Zeichen lang.',[s,Length(s)])); end;
Code:
---------------------------
Editor --------------------------- > < ist 8 Zeichen lang. --------------------------- OK --------------------------- |
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.
![]() |
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:
|
AW: String-Ende mit while finden
Zitat:
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 |
AW: String-Ende mit while finden
Delphi-Quellcode:
Tja, wenn man die Char's zählt, dann bekommt man eben auch die Anzahl der Chars.
'>'#13#10#13#10#13#10'<' = 8
'>'#10#10#10'<' = 6 'hätte' = 5 'ha'#$0308'tte' = 6 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}; ![]() ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:33 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