ZetCode

FreeBasic ZString 关键字

最后修改日期:2025 年 6 月 16 日

FreeBasic 的 ZString 关键字代表一种以 null 结尾的 ASCII 字符串类型。它与 C 风格字符串兼容,并经常用于与外部库进行互操作。

基本定义

在 FreeBasic 中,ZString 是一种字符串类型,它以 ASCII 格式存储字符,并以 null 字符(ASCII 0)结尾。这使其与 C 字符串兼容。

ZString 变量默认是固定长度的,但可以与指针一起用于动态字符串。它们非常适合处理期望 C 风格字符串的 Windows API 函数和其他外部库。

声明 ZString 变量

此示例展示了如何声明和初始化 ZString 变量。

zstring_declare.bas
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 结尾的字符串。

zstring_pointer.bas
Dim pz As ZString Ptr
pz = Allocate(50)

*pz = "FreeBasic ZString Example"

Print *pz
Print Len(*pz)

Deallocate(pz)

此示例演示了动态 ZString 分配。我们分配内存,赋值字符串,然后打印它。完成后请务必释放内存。指针语法允许灵活的字符串操作。

函数参数中的 ZString

在与 C 交互时,ZString 通常用于函数参数。

zstring_function.bas
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 数组可以高效地存储多个固定长度的字符串。

zstring_array.bas
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 类型之间进行转换。

zstring_conversion.bas
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 至关重要。

zstring_winapi.bas
#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 类型

功能ZStringString
终止Null 结尾长度前缀
编码ASCIIUTF-16 或 ASCII
Memory固定大小动态
C 兼容性
默认

最佳实践

本教程介绍了 FreeBasic 的 ZString 关键字,并通过实际示例展示了它在不同场景下的用法。

作者

我叫 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 FreeBasic 教程