Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi string 0 terminiert? (https://www.delphipraxis.net/194204-string-0-terminiert.html)

EWeiss 28. Okt 2017 00:16

string 0 terminiert?
 
JA sollte eigentlich so sein.
Die Frage die sich mir stellt.

Ich muss einen String erweitern ist dieser dann immer noch Null terminiert oder nicht?
Oder vorsichtshalber ein #0 anhängen.

gruss

Zacherl 28. Okt 2017 01:10

AW: string 0 terminiert?
 
Kommt auf den Kontext und die Sprache an. Delphi Strings sind standardmäßig nicht nullterminiert.
Delphi-Quellcode:
PAnsi/WideChar
ist nullterminiert, aber hier müsstest du erklären, wie genau du die "Erweiterung" vornimmst. Wenn du einfach zwei
Delphi-Quellcode:
PAnsi/WideChar
Variablen mit
Delphi-Quellcode:
+
konkatenierst, wird die abschließende 0 automatisch hinzugefügt. In anderen Szenarien muss das nicht zwingend der Fall sein.

EWeiss 28. Okt 2017 01:20

AW: string 0 terminiert?
 
Ich habe einen String der aus einer JSon Datei aus dem Internet gefüllt wird.
Den will ich jetzt erweitern.

Delphi-Quellcode:
ltempBuf := ltempBuf + ',"';


Die frage wäre ist es überhaupt nötig den NULL terminierten Char anzuhängen?
Delphi-Quellcode:
ltempBuf := ltempBuf + ',"' + #0;


gruss

Zacherl 28. Okt 2017 01:35

AW: string 0 terminiert?
 
Wenn du den String vor Verwendung nach
Delphi-Quellcode:
PAnsi/WideChar
castest, bzw. die Variable eh schon diesen Typ hat, dann musst du die 0 nicht manuell anhängen. Wenn du irgendwelche "Pointer Magie" betreibst, dann unter Umständen schon :-D

EWeiss 28. Okt 2017 01:39

AW: string 0 terminiert?
 
Zitat:

Zitat von Zacherl (Beitrag 1384387)
Wenn du den String vor Verwendung nach
Delphi-Quellcode:
PAnsi/WideChar
castest, bzw. die Variable eh schon diesen Typ hat, dann musst du die 0 nicht manuell anhängen. Wenn du irgendwelche "Pointer Magie" betreibst, dann unter Umständen schon :-D

Nein es ist ein String und das bleibt er bis zum Ende ;)
Wenn ich dich dann richtig verstanden habe kann ich mir das sparen.

gruss

Zacherl 28. Okt 2017 01:46

AW: string 0 terminiert?
 
Zitat:

Zitat von EWeiss (Beitrag 1384388)
Zitat:

Zitat von Zacherl (Beitrag 1384387)
Wenn du den String vor Verwendung nach
Delphi-Quellcode:
PAnsi/WideChar
castest, bzw. die Variable eh schon diesen Typ hat, dann musst du die 0 nicht manuell anhängen. Wenn du irgendwelche "Pointer Magie" betreibst, dann unter Umständen schon :-D

Nein es ist ein String und das bleibt er bis zum Ende ;)
Wenn ich dich dann richtig verstanden habe kann ich mir das sparen.

An welche Funktion übergibst du den String den letztenendes? Wenn die Funktion einen normalen Delphi String erwartest, kannst du dir die 0 definitiv sparen. Im Falle von
Delphi-Quellcode:
PAnsi/WideChar
allerdings grundsätzlich auch, weil die 0 dann durch einen entsprechenden Cast automatisch hinzugefügt werden würde.

EWeiss 28. Okt 2017 01:51

AW: string 0 terminiert?
 
Ja ist ein normalen Delphi String.
Ich war mir nur nicht sicher.

gruss

Zacherl 28. Okt 2017 01:54

AW: string 0 terminiert?
 
Zitat:

Zitat von EWeiss (Beitrag 1384390)
Ja ist ein normalen Delphi String.

Okay, ne dann musst du die 0 nicht hinzufügen. Bei Delphi Strings stehen vor
Delphi-Quellcode:
S[1]
noch zusätzliche Informationen, wie der RefCount und auch die Länge.

EWeiss 28. Okt 2017 01:58

AW: string 0 terminiert?
 
Zitat:

Zitat von Zacherl (Beitrag 1384391)
Zitat:

Zitat von EWeiss (Beitrag 1384390)
Ja ist ein normalen Delphi String.

Okay, ne dann musst du die 0 nicht hinzufügen. Bei Delphi Strings stehen vor
Delphi-Quellcode:
S[1]
noch zusätzliche Informationen, wie der RefCount und auch die Länge.

Ok Danke ;)
Neues Icone im Profil ... LOL.

gruss

Ydobon 28. Okt 2017 09:45

AW: string 0 terminiert?
 
Zitat:

Zitat von Zacherl (Beitrag 1384385)
Delphi Strings sind standardmäßig nicht nullterminiert.

Waren die nicht kurzen Strings nicht schon von Anfang an eine Chimäre, also sowohl Längen- und Referenzzähler aber zusätzlich auch noch ein bis zwei Nullbyte zum Abschluss?

p80286 28. Okt 2017 21:10

AW: string 0 terminiert?
 
Zitat:

Zitat von Ydobon (Beitrag 1384400)
Zitat:

Zitat von Zacherl (Beitrag 1384385)
Delphi Strings sind standardmäßig nicht nullterminiert.

Waren die nicht kurzen Strings nicht schon von Anfang an eine Chimäre, also sowohl Längen- und Referenzzähler aber zusätzlich auch noch ein bis zwei Nullbyte zum Abschluss?

nein,ja,nein,nein

die Shortstrings bestehen aus einem Längenbyte und 255 CharBytes.

Gruß
K-H

uligerhardt 29. Okt 2017 08:22

AW: string 0 terminiert?
 
Normale Delphi-Strings (also AnsiString/UnicodeString) haben eine 0 hintendran, damit der PChar-Cast ohne Speicherallozierung etc. funktioniert.
Wenn du willst, kannst du das natürlich mit irgendwelcher Low-level-Bitschubserei hinter Delphis Rücken torpedieren. :mrgreen:
Aber bei String-Verkettung und so bleibt die 0-Terminierung erhalten.

EWeiss 29. Okt 2017 09:40

AW: string 0 terminiert?
 
Das ist wieder ein Thema wo unterschiedliche Meinungen kursieren.
Es muss doch möglich sein vom Standard abzuleiten.

Der eine Ja, der andere Nein, der nächste Ja.. was denn nu ist Korrekt und wird in der Sprache (Delphi) verwendet.

gruss

Fritzew 29. Okt 2017 10:20

AW: string 0 terminiert?
 
Zitat:

Zitat von EWeiss (Beitrag 1384446)
Das ist wieder ein Thema wo unterschiedliche Meinungen kursieren.
Es muss doch möglich sein vom Standard abzuleiten.

Der eine Ja, der andere Nein, der nächste Ja.. was denn nu ist Korrekt und wird in der Sprache (Delphi) verwendet.

gruss

Es ist eigentlich ganz einfach.......
Delphi Strings (UnicodeString, AnsiString) benötigen kein #0 am Ende und erwarten es auch nicht.
Dies Typen haben ein internes Längenfeld wo die aktuelle Länge gespeichert wird.
Wenn so ein String nach Pchar (Pwidechar, Pansichar) gecastet wird ein #0 am Ende angehängt. (lassen wir die technische Seite mal weg). Das ist nützlich weil diese Strings so einfach z.B zur WindowsApi übergeben werden können.

Solange Du mit den Delphi String Funktionen arbeitest muss Dich das nicht interessieren.
Wenn Du aber selber ein #0 anhängst so ala String := String +#0 dann wird die Länge um 1 erhöht und das #0 ist Bestandteil des DelphiStrings. Wird dieser nun nach Pchar etc.. gecastet sieht das dann aus wie String#0#0.
Umgekehrt gilt dann aber wird dieser Pchar zurück zu einem String gecastet fallen beide #0 weg.

Beispiel

Delphi-Quellcode:
procedure test;
 var
   a : array[0..10] of char;
   l: Integer;
   pa : PChar;
   s : String;
begin

   s := 'Test';
   l := length(s);  // 4

   s := s + #0;    // s = 'Test'#0;
   l := length(s); // 5

   pa := @a[0];
   StrPCopy(pa, s);

   l := strlen(pa); //  4

   s := pa;   // s = 'Test';
   l := length(s); //4

end;

EWeiss 29. Okt 2017 10:26

AW: string 0 terminiert?
 
Jo. Danke mich wundert nur das hier wieder alle eine andere Meinung dazu haben.
Und man am ende nicht weis an was man sich halten soll!

Das meine ich mit Standard.

gruss

Bernhard Geyer 29. Okt 2017 11:01

AW: string 0 terminiert?
 
Zitat:

Zitat von EWeiss (Beitrag 1384453)
Jo. Danke mich wundert nur das hier wieder alle eine andere Meinung dazu haben.
Und man am ende nicht weis an was man sich halten soll!

Hä? Bisher haben doch im Prinzip alle das gleiche gesagt.

Zitat:

Zitat von EWeiss (Beitrag 1384453)
Das meine ich mit Standard.

Am besten liest du dir die Beschreibung des internen Speicherformats für die diversen Delphi-Stringtypen durch.
http://docwiki.embarcadero.com/RADSt...e_String-Typen

EWeiss 29. Okt 2017 11:03

AW: string 0 terminiert?
 
Zitat:

Hä? Bisher haben doch im Prinzip alle das gleiche gesagt.
Kann ich nicht bestätigen aber egal.

bin raus.

gruss

uligerhardt 29. Okt 2017 12:13

AW: string 0 terminiert?
 
Zitat:

Zitat von EWeiss (Beitrag 1384457)
Zitat:

Hä? Bisher haben doch im Prinzip alle das gleiche gesagt.
Kann ich nicht bestätigen aber egal.

Na ja, manche haben das Gleiche wie ich gesagt und manche was Falsches. :twisted:

Bernhard Geyer 29. Okt 2017 12:44

AW: string 0 terminiert?
 
Zitat:

Zitat von uligerhardt (Beitrag 1384459)
Zitat:

Zitat von EWeiss (Beitrag 1384457)
Zitat:

Hä? Bisher haben doch im Prinzip alle das gleiche gesagt.
Kann ich nicht bestätigen aber egal.

Na ja, manche haben das Gleiche wie ich gesagt und manche was Falsches. :twisted:

Eigentlich war das falsche (wenn du den gleichen Post meindest) auch nur eine Frage.

Ansonsten haben doch alle das gleiche Bezüglich "Delphistring hat immer #0 am Ende" gesagt.

uligerhardt 29. Okt 2017 12:48

AW: string 0 terminiert?
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1384460)
Eigentlich war das falsche (wenn du den gleichen Post meindest) auch nur eine Frage.

Ansonsten haben doch alle das gleiche Bezüglich "Delphistring hat immer #0 am Ende" gesagt.

Naja, vielleicht hab ich manche missverstanden. Dein Link zur Doku sollte jedenfalls alle Fragen geklärt haben. :thumb:

Luckie 29. Okt 2017 21:03

AW: string 0 terminiert?
 
Und wenn man pragmatisch einfach generell eine #0 dran hängt? OK. Kann nur Probleme bereiten wenn es um PChar Listen geht. Also diese Multilien-Dinger aus der Registry zum Bespiel: Trennung der einzelnen Eintrage durch #0 und abschließen der Liste mit #0#0.

himitsu 29. Okt 2017 21:05

AW: string 0 terminiert?
 
LongStrings von Delphi (AnsiString, UnicodeString usw.) und der WideString haben zwar eine Längenangabe, aber auch jeweil implizit ein #0#0 am Ende, für schnelle Casts zu PChar.

Nur der ShortString (der String-Typ bis Delphi 1) haben ausschließlich das LängenByte auf Position 0. (drum fangen die LongStrings auch mit 1 an zu zählen, obwohl sie kein Längenbyte an dieser Stelle haben)

Namenloser 29. Okt 2017 22:59

AW: string 0 terminiert?
 
Zitat:

Zitat von himitsu (Beitrag 1384512)
LongStrings von Delphi (AnsiString, UnicodeString usw.) und der WideString haben zwar eine Längenangabe, aber auch jeweil implizit ein #0#0 am Ende, für schnelle Casts zu PChar.

Endlich sagt es mal einer.

Also, noch mal im Klartext: Die Antwort auf die ursprüngliche Frage
Zitat:

Zitat von EWeiss (Beitrag 1384386)
Die frage wäre ist es überhaupt nötig den NULL terminierten Char anzuhängen?

lautet: Nein, ist nicht nötig.

Bernhard Geyer 30. Okt 2017 09:10

AW: string 0 terminiert?
 
Zitat:

Zitat von Namenloser (Beitrag 1384531)
Zitat:

Zitat von himitsu (Beitrag 1384512)
LongStrings von Delphi (AnsiString, UnicodeString usw.) und der WideString haben zwar eine Längenangabe, aber auch jeweil implizit ein #0#0 am Ende, für schnelle Casts zu PChar.

Endlich sagt es mal einer.

Das wurde schon oft genug gesagt und auch der Link
http://docwiki.embarcadero.com/RADSt...e_String-Typen
zeigt das sehr gut.

Zitat:

Zitat von Namenloser (Beitrag 1384531)
Also, noch mal im Klartext: Die Antwort auf die ursprüngliche Frage
Zitat:

Zitat von EWeiss (Beitrag 1384386)
Die frage wäre ist es überhaupt nötig den NULL terminierten Char anzuhängen?

lautet: Nein, ist nicht nötig.

Und das wurde auch von Zacherl in seinen ersten Posts gesagt.
Ich denke die ganze Verwirrung kommt von Satz "Delphi Strings sind standardmäßig nicht nullterminiert." her.
Das ist falsch. Auch wenn die Delphi primär auf die Längenangabe im String schaut, ist der #0 am Ende immer dabei.
Man kann damit auch den (Ansi)String "mißbrauchen" um ihn als Buffer für Binärdaten zu nutzen. Hatte vor Jahren mit Delphi 2 so gemacht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz