Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Längenveränderung eines Strings bei Addition einer #0


focus - Di 19.08.03 12:26
Titel: Längenveränderung eines Strings bei Addition einer #0
Mir ist eben aufgefallen das length nicht immer die "richtige" Länge des Strings zurückgibt.

Beispiel:

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 - Di 19.08.03 12:39
Titel: Re: Längenveränderung eines Strings bei Addition einer #0
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 - 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.


AndyB - 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.


Taurin - 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 - Sa 23.08.03 00:11

Wird aber leider sehr häufig benutzt. Und das vor allem von Microsoft.