String
 
标准数据类型:8位字符串

语法

Dim variable As String [ * size ]

说明

这个 String是一个字符数组。

声明不含size 参数的String根据字符串的长度动态调整大小。长度可以从0字节到2千兆字节。描述符包含指向实际字符串的指针,字符串的长度以及为其赋值的空间量。VarPtr将返回指向描述符的指针,而StrPtr将指向实际的字符串。

由于具有String的隐藏描述符,不鼓励手动赋值空间,例如使用内存赋值函数CAllocate(优先)为String.为String保留一定空间的常用方法是为了防止在循环中不必要的赋值,例如使用SpaceString功能。

尽管如此,如果需要,可以通过内存赋值功能AllocateCAllocateReallocate(请参阅使用注意事项)和字符串指针(它是一个指向字符串描述符的指针,而不是字符串数据)来仔细使用动态赋值)。当赋值内存来保存字符串描述符时,在释放每个字符串描述符(允许释放由字符串数据占用的内存)之前,字符串必须始终被破坏(设置为""),否则不可能以后释放它,并可能在程序继续中引发内存泄漏。

尽管使用描述符,隐式NULL字符(Chr(0))被添加到字符串的末尾,以允许将它们传递到外部库中的函数而不进行慢速拷贝。FreeBASIC的内部函数将忽略此字符,而不将其视为字符串的一部分。

使用fixed size 声明的String是一个QB风格的固定长度字符串,不管未使用的字符设置为0,不管使用什么“-lang”编译器选项。它没有描述符,它没有调整大小以适应其内容。与QB一样,如果数据溢出字符串的大小,则在右侧被截断。
固定长度字符串也以NULL字符终止,因此使用size + 1个字节的空间。此NULL终止符可能会在将来被删除,以防止冗余字符使用户定义的Type中的数据布局复杂化。

字符串变量名称不必以与BASIC其他方言相同的美元符号$结尾。在lang fb 变量后缀,包括美元符号,不允许完全。

例子


''可变长度
Dim a As String

a = "你好"
Print a

a += ",世界!"
Print a

Var b = "欢迎来到FreeBASIC"
Print b + "!" + a


''类似QB的$后缀
#lang "qb"

''DIM基于$后缀
Dim a$
a$ = "你好"

''基于$后缀的隐式声明
b$ = ",世界!"

Print a$ + b$


''可变长度字符串作为缓冲区

''为字符串预留空间,
''使用Space()生成大量的空格字符(ASCII 32)
Var mybigstring = Space(1024)
Print "缓冲地址:&h" & Hex( StrPtr( mybigstring ), 8 ) & ", 长度:" & Len( mybigstring )

''明确地破坏一个字符串
mybigstring = ""
Print "缓冲地址:&h" & Hex( StrPtr( mybigstring ), 8 ) & ", 长度:" & Len( mybigstring )


''可变长度字符串作为Const参数

''Const限定符防止字符串被修改
Sub silly_print( ByRef printme As Const String )
    Print ".o0(" & printme & ")0o."
    '如果取消注释,下一行将导致错误
    'printme =“傻印”
End Sub

Var status = "OK"

silly_print( "你好FreeBASIC!" )
silly_print( "状态:" + status )


与QB差别

  • 在QB中,字符串限制为32767个字符。
  • 在QB中,固定长度字符串的未使用字符以32(空格,或ASCII码)初始化。
  • 在QB中,静态或固定大小的字符串通常用于记录以表示数据的字节数;例如,一个长度为1的字符串,用于表示从文件读取的UDT中的1个字节。这在FreeBASIC中是不可能的,因为字符串总是具有NULL 字符。当转换从文件中读取UDT的QBasic代码时,请确保将所有“As String * n ”的实例替换为“As uByte(0 to n - 1)“或您的文件将不兼容。

参考