AGB  ·  Datenschutz  ·  Impressum  







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

String aufbereiten

Ein Thema von Salomon · begonnen am 3. Feb 2003 · letzter Beitrag vom 4. Feb 2003
Antwort Antwort
Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#1

String aufbereiten

  Alt 3. Feb 2003, 16:40
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:
  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]));
Mfg
Salomon
01001000 01100001 01101100 01101100 01101111
01010111 01100101 01101100 01110100 00100001

http://www.it-adviser.net
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#2
  Alt 3. Feb 2003, 17:06
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
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#3
  Alt 3. Feb 2003, 17:09
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
  Mit Zitat antworten Zitat
Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#4
  Alt 3. Feb 2003, 17:38
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
01001000 01100001 01101100 01101100 01101111
01010111 01100101 01101100 01110100 00100001

http://www.it-adviser.net
  Mit Zitat antworten Zitat
Brüggendiek

Registriert seit: 13. Dez 2002
Ort: Dortmund
275 Beiträge
 
Delphi 5 Standard
 
#5
  Alt 3. Feb 2003, 19:06
Hallo!

Zitat von oki:
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.
Das ist Unsinn!

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
Dietmar Brüggendiek
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#6
  Alt 4. Feb 2003, 17:03
Hallo,

also mal für Dietmar Brüggendiek. Ich habe mir den Code nicht ausgedacht, sondern nur versucht auf die Frage von Salomon
Zitat:
Kann mir einer erklären was genau mit dem String gemacht wird?
eine Interpretation zu finden.

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:
while (cmd <> '') and not (cmd[1] in ['a'..'z','A'..'Z','0'..'9']) do cmd:=copy(cmd,2,255);
sagt doch deutlich:
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
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#7
  Alt 4. Feb 2003, 17:05
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
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#8
  Alt 4. Feb 2003, 17:10
Zitat von Brüggendiek:
Ich kenne nur eine Anwendung für Shortstrings: in Records, die mit typisierten Datein verwendet werden sollen.
Schon mal etwas von Legacy-Anwendungen gehört???
......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Antwort Antwort


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 10:06 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