FreeBasic ZString 关键字
最后修改日期:2025 年 6 月 16 日
FreeBasic 的 ZString 关键字代表一种以 null 结尾的 ASCII 字符串类型。它与 C 风格字符串兼容,并经常用于与外部库进行互操作。
基本定义
在 FreeBasic 中,ZString 是一种字符串类型,它以 ASCII 格式存储字符,并以 null 字符(ASCII 0)结尾。这使其与 C 字符串兼容。
ZString 变量默认是固定长度的,但可以与指针一起用于动态字符串。它们非常适合处理期望 C 风格字符串的 Windows API 函数和其他外部库。
声明 ZString 变量
此示例展示了如何声明和初始化 ZString 变量。
Dim greeting As ZString * 20 = "Hello, there!" Dim emptyString As ZString * 10 Print greeting Print Len(greeting) Print emptyString
在这里,我们声明了两个 ZString 变量。第一个用字符串字面量初始化,最多可以容纳 20 个字符。第二个是空的,可以容纳 10 个字符。Len 函数返回实际的字符串长度。
带指针的 ZString
ZString 指针允许处理动态的以 null 结尾的字符串。
Dim pz As ZString Ptr pz = Allocate(50) *pz = "FreeBasic ZString Example" Print *pz Print Len(*pz) Deallocate(pz)
此示例演示了动态 ZString 分配。我们分配内存,赋值字符串,然后打印它。完成后请务必释放内存。指针语法允许灵活的字符串操作。
函数参数中的 ZString
在与 C 交互时,ZString 通常用于函数参数。
Declare Function CountVowels Alias "count_vowels" (ByVal s As ZString Ptr) As Integer
Function CountVowels(s As ZString Ptr) As Integer
Dim count As Integer = 0
Dim i As Integer = 0
While (*s)[i] <> 0
Select Case LCase((*s)[i])
Case "a", "e", "i", "o", "u"
count += 1
End Select
i += 1
Wend
Return count
End Function
Dim text As ZString * 50 = "Programming in FreeBasic"
Print "Vowel count: "; CountVowels(@text)
这展示了一个计算 ZString 中元音数量的函数。参数是 ZString 指针。我们迭代字符直到遇到 null 终止符。@ 运算符获取 ZString 变量的地址。
ZString 数组
ZString 数组可以高效地存储多个固定长度的字符串。
Dim days(7) As ZString * 10 = _
{ _
"Sunday", "Monday", "Tuesday", "Wednesday", _
"Thursday", "Friday", "Saturday" _
}
For i As Integer = 0 To 6
Print days(i)
Next
在这里,我们创建了一个包含 7 个 ZString 的数组,每个 ZString 最多可以容纳 10 个字符。我们用星期的名称初始化它们。该数组为多个固定长度字符串提供了高效的存储。
在 String 和 ZString 之间转换
FreeBasic 允许在 String 和 ZString 类型之间进行转换。
Dim fbString As String = "FreeBasic String" Dim zs As ZString * 50 = fbString Print "Original String: "; fbString Print "Converted ZString: "; zs Dim backToString As String = zs Print "Back to String: "; backToString
这演示了 String 和 ZString 之间的转换。赋值会自动处理转换。请注意,ZString 具有固定的缓冲区大小,而 String 是动态的。
ZString 与 Windows API
在调用期望 C 字符串的 Windows API 函数时,ZString 至关重要。
#Include Once "windows.bi"
Declare Function MessageBoxA Lib "user32.dll" _
(ByVal hWnd As Integer, ByVal lpText As ZString Ptr, _
ByVal lpCaption As ZString Ptr, ByVal uType As Integer) As Integer
Dim message As ZString * 100 = "This is a ZString message"
Dim title As ZString * 50 = "ZString Demo"
MessageBoxA(0, @message, @title, 0)
此示例展示了如何将 ZString 与 Windows API MessageBox 函数一起使用。我们使用 ZString 指针参数声明函数,并使用 @ 运算符传递我们 ZString 变量的地址。
ZString 与 String 的区别
此表比较了 FreeBasic 中的 ZString 和 String 类型
| 功能 | ZString | String |
|---|---|---|
| 终止 | Null 结尾 | 长度前缀 |
| 编码 | ASCII | UTF-16 或 ASCII |
| Memory | 固定大小 | 动态 |
| C 兼容性 | 是 | 否 |
| 默认 | 否 | 是 |
最佳实践
- 缓冲区大小:始终为 ZString 缓冲区分配足够的空间。
- Null 终止:确保字符串正确地以 null 结尾。
- API 调用:将 ZString 用于 Windows API 和外部库。
- 转换:转换为 String 以进行复杂的字符串操作。
- 指针:使用 ZString 指针进行动态字符串处理。
本教程介绍了 FreeBasic 的 ZString 关键字,并通过实际示例展示了它在不同场景下的用法。