究竟如何判断字符串是否结束???(50分)

  • 主题发起人 主题发起人 honestman
  • 开始时间 开始时间
H

honestman

Unregistered / Unconfirmed
GUEST, unregistred user!
在Delphi中判断字符串结束的依据是什么???
如果我的字符串中包含'/0',系统是否会认为我的字符串已经结束?
 
在Delphi中,字符类型有多种,string可以包括/0,ansistring好象不行,请查看一下help的详细说明。
 
to ht99:
  help的详细说明在哪个地方啊?
 
&#8226
AnsiString 这是 Pascal 缺省的字符串类型,它由 AnsiChar 字符组成,其长度没有限制,同时与
null 结束的字符串相兼容。
&#8226
ShortString 保留该类型是为了向后兼容Delphi 1.0 ,它的长度限制在 255 个字符内。
&#8226
WideString 功能上类似于AnsiString,但它是由 WideChar 字符组成的。
&#8226
PChar 指向 null 结束的 Char 字符串的指针,类似于 C 的char * 或 lpstr 类型。
&#8226
PAnsiChar 指向 null 结束的 AnsiChar 字符串的指针。
&#8226
PWideChar 指向 null 结束的 WideChar 字符串的指针。
缺省情况下,如果用如下的代码来定义字符串,编译器认为是 AnsiString 字符串:
var
S:string
//编译器认为S 的类型是 AnsiString
当然,能用编译开关 $H 来将 string 类型定义为 ShortString ,当 $H 编译开关的值为负时, string 变量
是 ShortString 类型;当$ H 编译开关的值为正时(缺省情况),字符串变量是 AnsiString 类型。
 
to 940801:
  你这段话是哪里找的啊?关于AnsiString的说明,我还是不太明白究竟是否可以有
#0在其内部啊?
 
我这段话是 <<Delphi 下的 windows 编程>>

AnsiString 内部不能有 #0
 
我编译运行如下代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
s:string;
begin
memo1.Lines.Clear;
s:='';
for j:=1 to 100 do begin
for i:=0 to 9 do begin
s:=s+inttostr(i);
end;
s:=s+#0;
end;
i:=memo1.Lines.Add(s);
showmessage(inttostr(length(s))+' '+inttostr(i));
end;
end.
结果是:
showmessage中显示“1100 0”;而memo1中显示“0123456789”。
为什么会这样?
 
在Delphi中判断字符串结束的依据是什么???
^
就这个
 
使用length()函数,依次读出来
 
to honestman, 你得到这个结果应该是正常的,“1100 0”中的 1100 是 S 的长度,
0 是 Memo1.Lines.Add 的返回值,是行号。

S 的长度是由 Delphi 动态分配的,Delphi 动态释放的,它虽然是 1100 个字节,
但当你读它的时候,它遇到第一个 #0 就算结束了,后面的就不管了
 
就是这个样子的
 
AnsiString其实是一个指针, 指向一个地址. 在这个地址的-4和-8字节处分别是这个
字符串的引用计数和长度. 我想Length函数是直接读取-8字节处的值, 而显示是以#0
来判断一个字符串是否结束. 这完全可以用PChar来模拟.
 
pos+copy试一下
 
看一下字符是不是Null
 
你的程序结果很正常,注意:string类型具有自动管理内存的能力,不需要你去分配,当然可用Setlength分配。
另外,现在,string同pchar完全兼容。(出自《Delphi 5开发人员指南》,可能不是原话,你可以参考参考该书)
 
>>这个地址的-4和-8字节处分别是这个字符串的引用计数和长度...
不对吧...(我不知道字符串有没有“引用计数”)
Length过程的汇编代码如下:
test eax,eax
jz @LStrLen+$7
mov eax,[eax,-$04] //在-4字节处存放长度信息
ret
 
那么,string最长可以是多少啊?
 
string没有长度限制
 
用setlength( )来判断。
var s:string;
i:integer;

s:='aaaaaaaaaaa';
for i:=0 to setlength(s) do
.....
 
>>string最长可以是多少啊
2GB.
 
后退
顶部