Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Nullterminisrte Strings


IHops - Mi 11.03.09 17:34
Titel: Nullterminisrte Strings
Hab nach langer Zeit mal wieder was mit Strings zu tun .. das erste mal in Delphi 2007 ...

Folgendes Beispielprogramm:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure Test(sin: stringvar sout: string);
var
  i : integer;
begin
  sout := '';
  for i := 0 to Length(sin)-1 do
    sout := sout + sin[i];
end;


Der Ergebnisstring sout hat am Ende einen Wert, der mit #0 beginnt, d. h. das Ergenis ist ein leerer String.

Auch wenns blöd klingt ... früher gings so ...

Daher die Frage: Wie kann ich Nullterminierte Srings auf die obige Art verknüpfen? Geht das nur über strpas?


Gausi - Mi 11.03.09 17:36

Das erste Zeichen eines Strings ist myString[1], und das letzte myString[length(myString)]. Pass mal deine for-Schleife entsprechend an. ;-)

Edit, zur Erklärung: String[0] dürfte das letzte Byte der Längenangabe sein. Bei kurzen Strings dürfte das 0 sein.


AScomp - Mi 11.03.09 17:44

Der Index beginnt bei Strings bei 1, nicht bei 0. Sprich: das erste Zeichen steht in String[1], das letzte in String[Length(String)].

Ich vermute, das dürfte die Ursache sein.

Edit: War zu langsam. :-(


IHops - Mi 11.03.09 19:44

OK, danke für die schnelle Antwort ...

... nur ... war das schon immer so? Hab in Erinnerung, dass das erste Zeichen eines Feldes den Index 0 erhält. Zudem bin ich davon ausgegangen, dass bei nullterminierten Strings die Länge gerade nicht vorab gespeichert wird, sondern der String soweit geht, bis ein #0 zu sehen ist.


Gausi - Mi 11.03.09 19:50

Ja, das war schon immer so. Felder beginnen bei 0, Strings bei 1. ;-)

In Delphi sind Strings auch nicht unbedingt nullterminiert wie in den C-Sprachen, sondern etwas komplizierter aufgebaut. Z.B. die Längenangabe, die früher in String[0] stand (Pascal-Strings, auf 255 Zeichen beschränkt) und jetzt die 4 Bytes vor String[1] einnimmt. Davor kommt dann noch ein Referenzzähler.

Hat wohl beides Vor- und Nachteile. Mit den nullterminierten Strings kann man (teilweise) schneller arbeiten, dafür gibts in Delphi nicht so oft Overflows, weil jemand wieder was kopiert hat, wo lange keine 0 kommt.


jaenicke - Mi 11.03.09 19:51

user profile iconIHops hat folgendes geschrieben Zum zitierten Posting springen:
Zudem bin ich davon ausgegangen, dass bei nullterminierten Strings die Länge gerade nicht vorab gespeichert wird, sondern der String soweit geht, bis ein #0 zu sehen ist.
Dann musst du die aber auch benutzen. Also den Datentyp PChar.


delfiphan - Mi 11.03.09 19:55

Nur als Nebenbemerkung; Delphi-Strings haben wie oben beschrieben eine Angabe über die Länge des Strings. Sie sind aber auch immer nullterminiert (wobei #0 nicht als Teil des Strings zählt).


IHops - Mi 11.03.09 20:19

Hm, dann mal danke für die schnelle, prompte Aufklärung ... wieder was gelernt.