![]() |
String aufbereiten
Hallo,
ich habe schon wieder eine Frage zu einem Codeschnipsel der Strings aufbereitet. cmd ist ein String der vom Client an den Server geschickt wird. Kann mir einer erklären was genau mit dem String gemacht wird?
Code:
Mfg
if CB.GetCB(cmd) then
begin par:=trim(getend(cmd,2)); cmd:=trim(stupcase(getword(cmd,1))); while (cmd <> '') and not (cmd[1] in ['a'..'z','A'..'Z','0'..'9']) do cmd:=copy(cmd,2,255); while (cmd <> '') and not (cmd[length(cmd)] in ['a'..'z','A'..'Z','0'..'9']) do dec(byte(cmd[0])); Salomon |
Hallo,
unabhängig davon, dass ich die Methode Getend, stupcase usw. nicht kenne wird hier versucht einen vorhandenen String bis auf die Zeiche a bis z, A bis Z und 0 bis 9 zu bereinigen. Das in erster Linie durch beginnendes Löschen alle Leerzeichen (Trimm) und nachfolgendes kopieren des Strings in sich selbst wenn das erste Zeichen nicht in den Wertebereich paßt. (So: erstes zeichen nicht in ..., dann kopiere ab Stelle 2). Die Letste Schleife setzt das klassische Längenbyte des Strings (String[0] = Länge eines ShortStrings) einfach minus 1 wenn letztes Zeichen nicht im Wertebereich ist. Gruß oki |
Ach so,
noch vergessen zu sagen! Die Bereinigung wird nur für Anfang und Ende des Strings vorgenommen. Steht mittendrinn ein Zeichen außerhalb des benannten Wertebereiches wird das ignoriert. Bsp.: aus '$$adfre$$cd9se§§' wird 'adfre$$cd9se'. Gruß oki |
Danke für die Erklärung.
Die letzte Schleife prüft also, wenn ich dich richtig verstanden habe, nur ob die Bereinigung erfolgreich war. War sie es nicht wird die Länge des Strings auf Null gesetzt, indem das Längenbyte des Shortstrings auf minus 1 setzt. Der String ist damit leer und wird nicht weiter verarbeitet. So wie ich das sehe Bereinigt die erste While Schleife aber nur den Anfang des Strings oder? Mfg Salomon |
Hallo!
Zitat:
Das Längenbyte eines ShortString (stringvar[0]) gibt die Länge des Strings ohne das Längenbyte an, kann also Werte von 0 bis 255 annehmen! Dec(0) ergibt -1 - entweder kann das nicht in ein Char umgewandelt werden (Programm stürzt mit Exception ab) oder es kommt 255 raus - so war das nicht gemeint! Da nie sicher ist, ob wirklich ein Shortstring verwendet wird, sollte man bei Stringzugriffen immer mit Lenght und Setlength arbeiten und nie stringvar[0] benutzen. Außerdem: warum Shortstrings verwenden? Die dynamische Stringverwaltung von Delphi ist doch hervorragend - und die Beschränkung auf 255 Bytes entfällt. Ich kenne nur eine Anwendung für Shortstrings: in Records, die mit typisierten Datein verwendet werden sollen. Gruß Dietmar Brüggendiek |
Hallo,
also mal für Dietmar Brüggendiek. Ich habe mir den Code nicht ausgedacht, sondern nur versucht auf die Frage von Salomon Zitat:
Warum Decrementiert jemand das Byte [0] eines Strings? Ich habe im Moment nur eine sinnvolle Antwort: Längenbyte eines ShortStrings minus 1! Was besseres fällt mir dazu nicht ein. Im zusammenhang sehe ich nur folgendes: Zeile:
Code:
sagt doch deutlich:
while (cmd <> '') and not (cmd[1] in ['a'..'z','A'..'Z','0'..'9']) do cmd:=copy(cmd,2,255);
Prüfe so lange bis erstes Zeichen im Wertebereich, und so lange nicht kopiere den String ab Zeichen 2. Die darauffolgende Zeile sieht genauso aus, mit dem "kleinen" Unteschied, dass auf das letzte Zeichen geprüft wird. Ich tippe, ist das nicht im Wertebereich, will derjenige der das geschrieben hat auch das Zeichen loswerden (Bereinigung am Anfang und am Ende). Warum der nicht auch hier kopiert; aber mit Länge(String) - 1; entzieht sich meiner Kenntnis. Vielleicht ist das auch kein ShortString sondern was selbst gebasteltes wo jemand an Stelle Null was eigenes führt. Keine Ahnung! Ich arbeite nie explizit mit dem Längenbyte von ShortStrings (eigentlich auch nie mit ShortStrings wenn ich nicht gerade eine DLL schreibe und PChar's nicht haben will) und habe somit auch nicht ausprobiert wann der Compiler (oder welcher) Dec(byte(String[0]) akzeptiert. Also o.k. ich weiß nicht wo der Code herkommt, eine bessere Begründung fällt mir nicht ein. Für mich ist das weiterhin eine etwas eigenartige Lösung einen String am Anfang und Ende zu bereinigen. Gruß oki |
mir fällt noch was auf,
Die Schleife berücksichtigt übrigens auch dass der String keine Länge 0 hat! Mal genau ansehen! Ein Decrement auf String[0] bei Länge null wird unterbunden! Gruß oki |
Zitat:
...:cat:... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:50 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