Referenz - STRING (Datentyp)
Typ: Datentyp
Ein STRING ist eine Zeichenkette, die einen zusammenhängenden Text, einzelne Wörter, Buchstaben oder sonstige Zeichen enthalten kann; auch Leerstrings (also Strings ohne jeglichen Inhalt) sind möglich.
"Hallo!" ist ein Beispiel für einen String.
In FreeBASIC werden Strings immer von "Anführungszeichen" eingerahmt. Sollen in Ihrer Zeichenkette Anführungszeichen vorkommen, so können Sie dies auf verschiedene Weise erreichen:
- Durch Stringverkettung und CHR:
Der ASCII-Code eines Anführungszeichens ist 34. Sie können also einfach CHR(34) an einen String anhängen, wie in diesem Beispiel:
"Und er sagte: " & CHR(34) & "Möge die Macht mit dir sein" & CHR(34) - Zwei Anführungszeichen in Folge werden von FreeBASIC genauso implementiert wie ein CHR(34). Der genannte Beispielcode lässt sich also auch bequem eingeben als:
"Und er sagte: ""Möge die Macht mit dir sein"""
Beachten Sie dabei aber, dass das abschließende Anführungszeichen, welches das Stringende markiert, nicht fehlen darf! - Seit v0.17 kann auch die folgende Schreibweise benutzt werden:
!"Und er sagte: \34Möge die Macht mit dir sein\34"
(man beachte das Ausrufezeichen vor dem ersten Anführungszeichen)
Man unterscheidet zwei Arten von Strings:
- var-length-Strings (Strings variabler Länge)
- fixed-length-Strings (Strings fester Länge)
Var-length-Strings werden dynamisch verwaltet; ihre Größe im Speicher hängt von der Länge des Strings ab. Sie werden durch diese Zeile erstellt:
DIM variable AS STRING
Strings variabler Länge werden intern über einen Descriptor (dt: Bezeichner) gehandhabt. Dieser Bezeichner enthält einen Pointer zum eigentlichen String und der Länge des Strings.
VARPTR gibt einen Pointer auf den Bezeichner zurück, während STRPTR einen Pointer auf den tatsächlichen String zurückgibt.
Am Ende eines Strings wird automatisch ein CHR(0) angehängt. Dadurch kann bei der Übergabe an externe Funktionen auf zeitaufwändiges Kopieren verzichtet werden.
Der Bezeichner eines Strings variabler Länge enthält drei Dinge: Die Adresse der Zeichenkette, ihre Länge und der für die Zeichenkette reservierte Speicherplatz. Aus diesem Grund gibt SIZEOF(STRING) 12 (bei einem 32bit-Compiler) bzw. 24 (bei einem 64bit-Compiler) aus. Dieser Wert ergibt sich durch eine Pointer-Adresse zu 4 bzw. 8 Bytes und zwei INTEGER, ebenfalls 4 bzw. 8 Bytes groß. Dass die Länge der Zeichenkette und der reservierte Speicherplatz in der Regel nicht übereinstimmen, liegt ganz einfach daran, dass dadurch nicht bei jeder Änderung des String-Inhalts ein kostenintensives Reservieren und Umkopieren des Speichers erforderlich ist.
Achtung: Bei der Nutzung von variablen Strings sollte auch der Artikel zu BYVAL (Schlüsselwort) gelesen werden, da die Nutzung von BYVAL in Parameter-Deklarationen von Funktionen oder SUB-Routinen zu Problemen führen kann.
Ein fixed-length-String verhält sich wie ein QB-String fester Länge. Er wird folgendermaßen erstellt:
DIM variable AS STRING * Länge
Länge ist dabei eine Konstante oder ein einfacher Ausdruck; Länge darf KEINE Variablen enthalten.
Strings fester Länge haben keinen descriptor und werden nicht redimensioniert, wenn sich die Länge der enthaltenen Zeichenkette ändert. Wenn einem String fester Länge eine Zeichenkette zugewiesen werden soll, die größer ist als die zuvor festgelegte Länge des Strings, dann wird sie - wie in QB - am rechten Ende abgeschnitten, so dass sie in die String-Speicherstelle passt.
Soll also
1234567890
in einem String mit fester Länge 5 gespeichert werden, enthält der String anschließend die Zeichenkette
12345
Ein String - egal ob fixed oder var length - kann bei einem 32bit Compiler bis zu 2.147.483.648 Zeichen lang sein, bei 64bit bis zu 9.223.372.036.854.775.808; dies entspricht einer Datenmenge von 2 GB bzw. 8.388.607 TB.
Alle Strings können indiziert werden. Das bedeutet, man kann den ASCII-Code jedes beliebigen Zeichens innerhalb eines Strings über seinen Index ermitteln. Dazu verwendet man die Syntax
ASCII = StringVariable[n]
wobei 'n' die Nummer des Zeichens im String minus eins ist. Das erste Zeichen eines Strings wird also über StringVariable[0] indiziert. Das letzte Zeichen wäre 'LEN(StringVariable) - 1'. Werden Bereiche außerhalb dieser Werte verwendet, kann das zu schweren Fehlern führen.
Beispiel:
DIM a AS STRING, b AS STRING * 11 ' Strings erstellen
a = "hello World" ' und befüllen
b = a
PRINT a ' auf dem Bildschirm ausgeben
PRINT b
PRINT
DIM aa AS STRING PTR, ab AS byte PTR ' Zwei Pointer zur Analyse...
aa = @a ' die Adresse des Bezeichners
ab = cptr(byte ptr, @b) ' die Adresse des ersten Zeichens
PRINT aa ' Adressen ausgeben
PRINT ab
PRINT
PRINT *ab ' 104, ASCII-Code von h, dem
' ersten Zeichen im String
PRINT CHR(*ab) ' h, das erste Zeichen im String
PRINT
PRINT PEEK(UINTEGER, aa) ' beide Male die Adresse der
PRINT STRPTR(a) ' eigentlichen Zeichenkette
PRINT
PRINT PEEK(UBYTE, PEEK(UINTEGER, aa)) ' Beide Male das erste Zeichen des
PRINT a[0] ' var-length-Strings als ASCII...
PRINT
PRINT CHR(PEEK(UBYTE, PEEK(UINTEGER, aa))) ' und als Zeichen.
PRINT CHR(a[0])
SLEEP
Ausgabe:
hello World
hello World
3216641896
3216641884
104
h
166291024
166291024
104
104
h
h
Unterschiede zu QB:
- Ein QB-String kann maximal 32.767 Zeichen lang sein; ein FB-String darf bis zu 2.147.483.648 bzw. 9.223.372.036.854.775.808 Zeichen lang sein.
- In FreeBASIC wird einem String intern ein CHR(0) angehängt.
Siehe auch:
SIZEOF, VARPTR, STRPTR, CAST, CHR, ASC, STR, VAL, BIN, HEX, OCT, SPACE, INPUT (Funktion), DIM, ZSTRING, WSTRING (Datentyp), Datentypen, Datentypen und Deklarationen, String-Funktionen
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|