Autor |
Beitrag |
IHops
      
Beiträge: 26
Vista
Delphi 7, Delphi 2007
|
Verfasst: Mi 11.03.09 18:34
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: string; var 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
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mi 11.03.09 18: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.
_________________ We are, we were and will not be.
|
|
AScomp
      
Beiträge: 162
Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
|
Verfasst: Mi 11.03.09 18: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 
      
Beiträge: 26
Vista
Delphi 7, Delphi 2007
|
Verfasst: Mi 11.03.09 20: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
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mi 11.03.09 20: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.
_________________ We are, we were and will not be.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 11.03.09 20:51
IHops hat folgendes geschrieben : | 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Mi 11.03.09 20: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 
      
Beiträge: 26
Vista
Delphi 7, Delphi 2007
|
Verfasst: Mi 11.03.09 21:19
Hm, dann mal danke für die schnelle, prompte Aufklärung ... wieder was gelernt.
|
|