Null-terminiert: Unterschied zwischen den Versionen
Flo (Diskussion | Beiträge) K (→Für C++ Programmiere{r}) |
Lyr (Diskussion | Beiträge) |
||
Zeile 1: | Zeile 1: | ||
Strings in der Programmiersprache '''C''' sind Felder (Arrays) die Zeichen (Char) enthalten. Das Ende der Zeichenkette ist markiert mit dem Endezeichen "'''\0'''". | Strings in der Programmiersprache '''C''' sind Felder (Arrays) die Zeichen (Char) enthalten. Das Ende der Zeichenkette ist markiert mit dem Endezeichen "'''\0'''". | ||
− | === | + | ===Darstellungsmöglichkeiten von Strings=== |
− | + | ====ShortString in Delphi==== | |
+ | 5,"Hallo" | ||
+ | Hier bedeutet der Wert 5, dass der String 5 Zeichen lang ist. Der Wert 5 wird hier (meines Wissens) im ersten Byte des Arrays gespeichert. | ||
− | Meist wird nicht das Feld selbst übergeben sondern | + | ====Null-terminiert==== |
+ | "Hallo",0 | ||
+ | Das letzte Byte des Strings hat den Wert 0, was angibt das der String hier zu ende ist. Die Länge eines solchen Strings kann man sich natürlich leicht berechnen. | ||
+ | |||
+ | Diese Methode hat den Vorteil, dass der String keine Längenbegrenzung hat, er kann also auch ein paar Megabyte groß sein. Bei einer Methode ähnlich zu ShortString bräuchte man dafür bereits eine 4 Byte große Längenangabe. | ||
+ | |||
+ | Der Nachteil ist aber natürlich, dass man sich die Länge des Strings berechnen muss wenn man sie benötigt. Null-terminierte Strings sind also bei vielen Operationen etwas langsamer. | ||
+ | |||
+ | ===Wieso benutzt [[OpenGL]] Null-terminierte Strings?=== | ||
+ | Für Standards ist es immer wünschenswert möglichst wenig Fehleranfällig (hier im Bezug auf Überläufe oder Overflows) und gleichzeitig möglichst wenig Spezialfälle zu bieten. Hier wurde also auf die etwas geringere Performance keine Rücksicht genommen. | ||
+ | |||
+ | Meist wird nicht das Feld selbst übergeben sondern ein Zeiger (Pointer) auf das Feld. (Pointer auf Null-terminierte Strings heißen deshalb in Pascal/Delphi auch '''PChar'''). Damit ist man dann theoretisch in der Lage den String zu benutzen. Wenn man im Delphi-Stil die Länge eines Strings haben möchte, muss man sich diese wie bereits erwähnt selbst berechnen, also den String nach dem "'''\0'''"-Zeichen durchsuchen. | ||
===Für C++ Programmierer=== | ===Für C++ Programmierer=== | ||
Die STL-Klasse "String" erlaubt auch den gespeicherten String als "C-String" also als Null-terminierten String zu verwenden. Der entsprechende Funktionsaufruf ist {{INLINE_CODE|String.c_str()}}. | Die STL-Klasse "String" erlaubt auch den gespeicherten String als "C-String" also als Null-terminierten String zu verwenden. Der entsprechende Funktionsaufruf ist {{INLINE_CODE|String.c_str()}}. |
Version vom 10. November 2005, 02:07 Uhr
Strings in der Programmiersprache C sind Felder (Arrays) die Zeichen (Char) enthalten. Das Ende der Zeichenkette ist markiert mit dem Endezeichen "\0".
Inhaltsverzeichnis
Darstellungsmöglichkeiten von Strings
ShortString in Delphi
5,"Hallo"
Hier bedeutet der Wert 5, dass der String 5 Zeichen lang ist. Der Wert 5 wird hier (meines Wissens) im ersten Byte des Arrays gespeichert.
Null-terminiert
"Hallo",0
Das letzte Byte des Strings hat den Wert 0, was angibt das der String hier zu ende ist. Die Länge eines solchen Strings kann man sich natürlich leicht berechnen.
Diese Methode hat den Vorteil, dass der String keine Längenbegrenzung hat, er kann also auch ein paar Megabyte groß sein. Bei einer Methode ähnlich zu ShortString bräuchte man dafür bereits eine 4 Byte große Längenangabe.
Der Nachteil ist aber natürlich, dass man sich die Länge des Strings berechnen muss wenn man sie benötigt. Null-terminierte Strings sind also bei vielen Operationen etwas langsamer.
Wieso benutzt OpenGL Null-terminierte Strings?
Für Standards ist es immer wünschenswert möglichst wenig Fehleranfällig (hier im Bezug auf Überläufe oder Overflows) und gleichzeitig möglichst wenig Spezialfälle zu bieten. Hier wurde also auf die etwas geringere Performance keine Rücksicht genommen.
Meist wird nicht das Feld selbst übergeben sondern ein Zeiger (Pointer) auf das Feld. (Pointer auf Null-terminierte Strings heißen deshalb in Pascal/Delphi auch PChar). Damit ist man dann theoretisch in der Lage den String zu benutzen. Wenn man im Delphi-Stil die Länge eines Strings haben möchte, muss man sich diese wie bereits erwähnt selbst berechnen, also den String nach dem "\0"-Zeichen durchsuchen.
Für C++ Programmierer
Die STL-Klasse "String" erlaubt auch den gespeicherten String als "C-String" also als Null-terminierten String zu verwenden. Der entsprechende Funktionsaufruf ist String.c_str().