在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
Delphi 的字符及字符串 - Char、AnsiChar、WideChar、PChar、PAnsiChar、PWideCharDelphi有三种类型的字符: AnsiChar这是标准的1字节的ANSI字符,程序员都对它比较熟悉。 WideChar这是2字节的Unicode字符。 Char在目前相当于AnsiChar,但在Delphi以后版本中相当于WideChar. 记住因为一个字符在长度上并不表示一个字节,所以不能在应用程序中对字符长度进行硬编码,而应该使用Sizeof()函数。注意Sizeof()标准函数返回类型或实例的字节长度。
字符串是代表一组字符的变量类型,每一种语言都有自己的字符串类型的存储和使用方法。 Pascal类型有下列几种不同的字符串类型来满足程序的要求: AnsiString这是Pascal缺省的字符串类型,它由AnsiChar字符组成,其长度没有限制,同时与null结束的字符串相兼容。 ShortString保留该类型是为了向后兼容Delphi1.0,它的长度限制在255个字符内。 WideString功能上类似于AnsiString,但它是由WideChar字符组成的。 PChar指向null结束的Char字符串的指针,类似于C的char*或lpstr类型。 PAnsiChar指向null结束的AnsiChar字符串的指针。 PWideChar指向null结束的WideChar字符串的指针。 缺省情况下,如果用如下的代码来定义字符串,编译器认为是AnsiString字符串:
AnsiString(或长字符串)类型是在Delphi2.0开始引入的,因为Delphi1.0的用户特别需要一个容易使用而且没有255个字符限制的字符串类型,而AnsiString正好能满足这些要求。
S1,S2:string; begin //给S1赋值,S1的引用计数为1 S1:='Andnowforsomething...'; S2:=S1;//现在S2与S1指向同一个字符串,S1的引用计数为2 //S2现在改变了,所以它被复制到自己的物理空间,并且S1的引用计数减1 S2:=S2+'completelydifferent1'; end;
正如前面所提到,AnsiString字符串总是null结束的。因此,它能跟以null结尾的字符串兼容,这就使得调用Win32API函数或其他需要PChar型字符串的函数变得容易了。只要把一个字符类型强制转换为PChar类型(在2.8节“强制类型转换和类型约定”中将介绍强制类型转换)。下面的代码演示了怎样调用Win32的GetWindowsDirectory()函数,这个函数需要一个PChar类型的参数: var S:String; begin SetLength(S,256);//重要!首先给字符串分配空间 //调用API函数,S现在包含目录字符串 GetWindowsDirectory(PChar(S),256); 如果使用了将AnsiString字符串强制转换为PChar类型的函数和过程,在使用结束后,要手工把它的长度恢复为原来以null结束的长度。STRUTILS单元中的RealizeLenght()函数可以实现这一点: procedureRealizeLength(varS:string); begin SetLength(S,StrLen(PChar(S))); end; 调用ReallizeLength(): var S:string; begin SetLength(S,256);//重要!首先给字符串分配空间 //调用函数,S现在包含目录字符串 GetWindowDirectory(PChar(S),256); RealizeLength(S);//设置S的长度为null结束的长度 end;
begin ifLength(S)=High(S)thenDec(S[0]);{如果S太长,就截取一部分} S[Ord(Length(S))+1]:=#0;{把null加到字符串的最后} Result:=@S[1];{返回PChar化的字符串} end; Win32API函数需要以null结尾的字符串,不要把ShortString字符串传递给API函数,因为编译器将报错,长字符串可以传递给Win32API函数。
WideString类型像AnsiString一样是生存期自管理类型,它们都能动态分配、自动回收并且彼此能相互兼容,不过WideString和AnsiString的不同主要在三个方面: WideString由WideChar字符组成,而不是由AnsiChar字符组成的,它们跟Unicode字符串兼容。 WideString用SysAllocStrLen()API函数进行分配,它们跟OLE的BSTR字符串相兼容。 WideString没有引用计数,所以将一个WideString字符串赋值给另一个WideString字符串时,就需要从内存中的一个位置复制到另一个位置。这使得WideString在速度和内存的利用上不如AnsiString有效。
var W:wideString; S:string; begin W:='Margaritaville'; S:=W;//wideString转换成AnsiString S:='ComeMonday'; W:=S;//AnsiString转换成WideString end; 为了能灵活地运用WideString类型,ObjectPascal重载了Concat()、Copy、Insert()、Length()、Pos()和SetLength()等例程以及+、=和<>等运算符。
var W:WideString; C:WideChar; begin W:='EbonyandIvorylivinginprefectharmony'; C:=W[Length(W)];//C包含W字符串的最后一个字符 end; 以null结束的字符串 正如前面所提到的,Delphi有三种不同的以null结束的字符串类型:PChar、PAnsiChar和PWideChar。它们都是由Delphi的三种不同字符组成的。这三种类型在总体上跟PChar是一致的。PChar之所以保留是为了跟Delphi1.0和Win32API兼容,而它们需要使用以null结束的字符串,PChar被定义成一个指向以null(零)结束的字符串指针与AnsiString和WideString类型不同,PChar的内存不是由ObjectPascal自动产生和管理的,要用Object Pascal的内存管理函数来为PChar所指向的内存进行分配。PChar字符串的理论最大长度是4GB
{用十六进制方式赋值:} {用 Chr 函数代替 # 符号} {Char 长度当然会是 1} {Char、AnsiChar 允许这样方便地赋值(也就是和 1 字节长度的字符串是兼容的):} //UniCode 字符 WideChar; 和 AnsiChar 不同, WideChar 是占 2 字节大小. {用十六进制赋值} {用十进制赋值} {如果不超出 #255 的范围是可以直接赋值的} {这样不行} {可以这样变通一下:} {用 WideChar 的方式显示我的名字} //字符指针 PChar、PAnsiChar; 在当前版本(2007)中它们没有区别. {给变量值需要转换} //宽字符指针 PWideChar {给变量值需要转换} |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论