Autor Beitrag
focus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 187

XP, 2k, 98, Me
D6 Prof
BeitragVerfasst: Di 19.08.03 12:26 
Mir ist eben aufgefallen das length nicht immer die "richtige" Länge des Strings zurückgibt.

Beispiel:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var 
  test: string;
  len: integer;
begin
  test := 'schorsch';
  len := length(test); //len=8
  test := test+#0;
  len := length(test); //len=9
  trim(test);
  len := length(test); //len=8
end;

Da ein String nur bis zur ersten absoluten Null gültig ist, müsste auch beim zweiten Length '8' heraus kommen. Ich kann mir das nur so erklären:
Bei einer Addition eines Zeichens an den String wird das Längenbyte in der Klasse String verändert, was zur folge hat das Length, das dieses Byte abfragt, anstelle die Zeichen zu zählen, den verfälschten Wert zurückgibt.
Führt man nun 'trim' über dem String aus wird das Längenbyte des strings an die tatsächliche Länge der Zeichenfolge angepasst und ein 'richtiges' Ergebnis wird angezeigt.

Liege ich mit meinen Vermutungen richtig?
Gruss
Michael

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt & Topic verschoben.
barfuesser
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 324



BeitragVerfasst: Di 19.08.03 12:39 
Hallo,
focus hat folgendes geschrieben:
Da ein String nur bis zur ersten absoluten Null gültig ist,

Meines Wissens sind die Strings bei Delphi nicht Nullterminiert, d.h. #0 ist ein ganz normales Zeichen innerhalb des Strings.

barfuesser
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Di 19.08.03 14:14 
Delphi-Strings sind schon nullterminiert! Sie führen nur intern noch 2 32Bit Zähler mit - einen Referenzzähler und einen Längenzähler. Die Länge eines Strings entspricht immer der Anzahl der Bytes die er belegt (diese Bytes können durchaus auch Nullzeichen enthalten). Nicht umsonst kann man mit SetLength die Länge eines Strings festlegen, aber dennoch ist nach einem Aufruf von SetLength der Inhalt des Strings undefiniert. Um die "eigentliche" Länge des Strings (bis zum ersten Nullzeichen) zu erhalten kann man die Funktion strlen() benutzen.

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Di 19.08.03 22:43 
Das ist auch ein Grund, warum Bufferoverflows in Delphi Code recht selten sind aber in C/C++ Code an allen Ecken auftreten können.

_________________
Ist Zeit wirklich Geld?
Taurin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 34

Win XP
D6 Personal
BeitragVerfasst: Fr 22.08.03 16:55 
Um mal C++ zu verteidigen: C++ kennt den std::string , der genauso komfortabel (oder noch komfortabler) zu benutzen ist, wie der Delphi
string. Die ganze char* - Geschichte aus C ist nur noch aus Abwärts-
kompatibilitätsgründen enthalten.
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Sa 23.08.03 00:11 
Wird aber leider sehr häufig benutzt. Und das vor allem von Microsoft.

_________________
Ist Zeit wirklich Geld?