すべての組み込みデータ型の中で、
文字列 型は、文字列の表現専用です。
FreeBASIC は、さまざまな表現の文字列を処理するための、いくつかの文字列データ型を提供します。
固定長文字列型(string、zstring、wstring)は固定長の文字列を表し、可変長文字列型は可変長の文字列を表します。
固定長文字列
固定長文字列には 3つの型があります:
- 8ビット文字の固定長 string 型(QBスタイルの固定長文字列):
- STRING * size
fbc バージョン 1.20.0 以降、文字列の合計長: 'size' 文字 = 'size' バイト ('size'有用な文字)
fbc バージョン 1.20.0 未満、文字列の合計長: 'size+1' 文字 = 'size+1' バイト ('size' 有効文字 + '1' 最後のヌル文字)
- 8ビット文字の固定長 zstring 型:
- ZSTRING * size
zstring の全長: 'size' 文字 = 'size' bytes ('size-1' 有効文字 + '1' 最後のヌル文字)
又は
- ZSTRING PTR
ポイントされた zstring の全長:ポインターで参照される文字列に依存します(最後のヌル文字まで)
- ワイド文字用の固定長 wstring 型:
- WSTRING * size
wstring の全長: 'size' 文字 = 'size' x k(*) bytes ('size-1' 有効文字 + '1' 最後のヌル文字)
又は
- WSTRING PTR
ポイントされた wstring の全長:ポインターで参照される文字列に依存します(最後のヌル文字まで)
(*) WSTRING 文字が使うバイト数 'k' はプラットフォームによって異なります。
可変長文字列
可変長文字列の型は 1つだけです:
- 8ビット文字の可変長文字列型:
- STRING
string の全長:割り当てられたデータ文字に応じた動的な長さ
( 1 pointer + 2 uinteger の長さの内部記述子によって参照される文字列)
例
上記のすべての型の異なる文字列のサイズ(バイト単位):
' 出力結果は fbc version (before/since 1.20.0) で異なります
Dim As String * 20 s20 = "FreeBASIC manual"
Dim As ZString * 20 z20 = "FreeBASIC manual"
Dim As ZString Ptr pz = @"FreeBASIC manual"
Dim As WString * 20 w20 = "FreeBASIC manual"
Dim As WString Ptr pw = @WStr("FreeBASIC manual")
Dim As String s = "FreeBASIC manual"
Print Using "'FIXED-LENGTH STRING * 20': ## bytes in total, ## useful characters available"; SizeOf(s20); Len(s20)
Print Using " containing ## user characters of # byte(s) each"; IIf(InStr(s20, Chr(0)) > 0, InStr(s20, Chr(0)) - 1, Len(s20)); SizeOf(s20[0])
Print
Print Using "'FIXED-LENGTH ZSTRING * 20': ## bytes in total, ## useful characters available"; SizeOf(z20); SizeOf(z20) \ SizeOf(z20[0]) - 1
Print Using " containing ## user characters of # byte(s) each"; Len(z20); SizeOf(Z20[0])
Print "'ZSTRING PTR': dereferencing pointer -> "; """" & *pz & """"
Print Using " containing ## user characters of # byte(s) each"; Len(*pz); SizeOf((*pz)[0])
Print
Print Using "'FIXED-LENGTH WSTRING * 20': ## bytes in total, ## useful characters available"; SizeOf(w20); SizeOf(w20) \ SizeOf(w20[0]) - 1
Print Using " containing ## user characters of # byte(s) each"; Len(w20); SizeOf(w20[0])
Print "'WSTRING PTR': dereferencing pointer -> "; """" & *pw & """"
Print Using " containing ## user characters of # byte(s) each"; Len(*pw); SizeOf((*pw)[0])
Print
Type descriptor : Addr As ZString Ptr : UC As UInteger : AC As UInteger : End Type
Print Using "'STRING': ## bytes in descriptor, memory allocated for ## characters right now"; SizeOf(s); Cast(descriptor Ptr, @s)->AC
Print Using " containing ## user characters of # byte(s) each"; Len(s); SizeOf(s[0])
Sleep
注:固定長文字列型(QBスタイルの固定長文字列)のみの場合、'Len()' キーワードは、ユーザーによって割り当てられた文字数に関係なく、常に宣言された定数の文字数を返します。
(従って、fbcバージョン1.20.0以前の固定長文字列型に対する式のみ:
'user_characters_length = IIf(InStr(s, Chr(0)) > 0, InStr(s, Chr(0)) - 1, Len(s))')
fbc バージョン1.20.0 未満、win64での出力例(wstring文字は2バイトを使う):
'FIXED-LENGTH STRING * 20': 21 bytes in total, 20 useful characters available
containing 16 user characters of 1 byte(s) each
'FIXED-LENGTH ZSTRING * 20': 20 bytes in total, 19 useful characters available
containing 16 user characters of 1 byte(s) each
'ZSTRING PTR': dereferencing pointer -> "FreeBASIC manual"
containing 16 user characters of 1 byte(s) each
'FIXED-LENGTH WSTRING * 20': 40 bytes in total, 19 useful characters available
containing 16 user characters of 2 byte(s) each
'WSTRING PTR': dereferencing pointer -> "FreeBASIC manual"
containing 16 user characters of 2 byte(s) each
'STRING': 24 bytes in descriptor, memory allocated for 32 characters right now
containing 16 user characters of 1 byte(s) each
Zstring から Ubyte への暗黙の変換
二項演算子 (as assignment, equal, +, *, ...) のいずれかの演算対象が '
Zstring Ptr' ポインタ ('
pz')を逆参照する場合、他の演算対象に応じて '
Zstring' 文字列または '
Ubyte' 変数が得られます:
- 他の演算対象が数値の場合、逆参照された 'Zstring Ptr' ポインタ ('*pz') は、指定された 1文字への 'Ubyte' 参照として扱われます。
- この場合、 'Zstring' ポインター・インデックスを作成する '[]' 演算子が逆参照構文 ('pz[n]') として使われる場合、 'String' のインデックスを作成する '[]' 演算子 ('(*pz)[n]') の短縮版となります。
'
(*pz)[i]' と '
pz[i][k]' は常に数値(それぞれ '
Ubyte')なので、下のような等式が成り立ちます:
pz[i] = (*pz)[i]
(*pz)[i] = pz[i]
そしてこれも:
pz[i+k] = pz[i][k]
pz[i][k] = pz[i+k]
逆参照された '
Zstring Ptr' を '
Ubyte' 参照に変換する簡単なコード例(「代入」演算子と「+」演算子の演算対象として):
Dim As ZString * (14+1) z = "FreeBASIC "
Dim As ZString Ptr pz = @z
Print z
z[10] = Asc("2")
*(pz + 11) = Asc("0") '' *(pz + 11) is converted to an Ubyte reference
(*pz)[12] = Asc("1")
pz[13] = Asc("8") '' pz[13] is converted to an Ubyte reference
Print z
For I As Integer = 10 To 13
Print Str(z[I] - Asc("0"));
Next I
Print
For I As Integer = 10 To 13
Print Str((*pz)[I] - Asc("0"));
Next I
Print
For I As Integer = 10 To 13
Print Str(pz[I] - Asc("0")); '' pz[I] is converted to an Ubyte reference
Next I
Print
Sleep
出力:
FreeBASIC
FreeBASIC 2018
2018
2018
2018
参照