字符串类型 (string, zstring 和 wstring)
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=ProPgStringsTypes
- 最后更新: 2024-03-07
在所有内置数据类型中,字符串类型是专门用于表示字符序列的类型。
FreeBASIC 提供了几种字符串数据类型,用于处理各种表示形式的字符序列。
固定长度字符串类型(string、zstring 和 wstring)表示固定长度的字符序列,而可变长度字符串类型表示可变长度的字符序列。
固定长度字符串
有 3 种固定长度字符串类型:
- 8 位字符的固定长度字符串类型(QB 风格的固定长度字符串):
- 8 位字符的固定长度 zstring 类型:
- 宽字符的固定长度 wstring 类型:
可变长度字符串
只有一种可变长度字符串类型:
- 8 位字符的可变长度字符串类型:
示例
上述所有类型的不同字符串的大小(字节):
start GeSHi
' 结果取决于 fbc 版本(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)
#if __FB_VERSION__ < "1.20.0"
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])
#endif
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])
Sleepend GeSHi
注意:仅对于固定长度字符串类型(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 字节,可用 20 个字符
containing 16 user characters of 1 byte(s) each
'FIXED-LENGTH ZSTRING * 20': 共 20 字节,可用 19 个字符
containing 16 user characters of 1 byte(s) each
'ZSTRING PTR': 解引用指针 -> "FreeBASIC manual"
containing 16 user characters of 1 byte(s) each
'FIXED-LENGTH WSTRING * 20': 共 40 字节,可用 19 个字符
containing 16 user characters of 2 byte(s) each
'WSTRING PTR': 解引用指针 -> "FreeBASIC manual"
containing 16 user characters of 2 byte(s) each
'STRING': 描述符 24 字节,当前为 32 个字符分配了内存
containing 16 user characters of 1 byte(s) eachZstring 到 Ubyte 的隐式转换
当二元运算符(如赋值、等号、+、* 等)的任一操作数是解引用 'Zstring Ptr' 指针('pz')时,根据另一个操作数的不同,这可能给出 'Zstring' 字符串或 'Ubyte' 变量:
如果另一个操作数是数值,则解引用的 '
Zstring Ptr' 指针('*pz')将被视为对所指字符的 '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' 引用的简单代码示例(作为'赋值'运算符和'+'运算符的操作数):
start GeSHi
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
Sleepend GeSHi
输出:
FreeBASIC
FreeBASIC 2018
2018
2018
2018参见
String FunctionsStandard Data Type Limits
返回 目录