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); test := test+#0; len := length(test); trim(test); len := length(test); 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
Tino: 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!