Delphi中的空字符串
我的问题如下:Delphi中的空字符串,delphi,Delphi,我的问题如下: WideCompareStr(FName,'')<>0 WideCompareStr(FName,”)0 即使FName设置为“”,也返回false WideCompareStr(微调(FName),“”)0 返回所需的结果。为什么我必须修剪一个空字符串(“”),以便与另一个空字符串进行比较,以获得正确的结果 编辑: 为了澄清问题: 我有以下代码来测试widestring变量是否为空字符串 function TSybVerwandlung.isEmpty: B
WideCompareStr(FName,'')<>0
WideCompareStr(FName,”)0
即使FName设置为“”,也返回false
WideCompareStr(微调(FName),“”)0
返回所需的结果。为什么我必须修剪一个空字符串(“”),以便与另一个空字符串进行比较,以获得正确的结果
编辑: 为了澄清问题: 我有以下代码来测试widestring变量是否为空字符串
function TSybVerwandlung.isEmpty: Boolean;
var
I : Integer;
begin
Result:=true;
if WideCompareStr(FName,'')<>0 then Result:=false
else if WideCompareStr(FInfo,'')<>0 then Result:=false
else
begin
//additional tests
end;
end;
函数TSybVerwandlung.isEmpty:Boolean;
变量
I:整数;
开始
结果:=真;
如果WideCompareStr(FName“”)为0,则结果:=false
否则,如果WideCompareStr(FInfo,'')为0,则结果:=false
其他的
开始
//附加测试
终止
终止
即使FName设置为“”,此函数仍返回true(我在调试器中检查了它)。在插入trim(FName)和trim(FInfo)而不是变量之后,它返回了所需的结果
我错过了一些重要的东西吗?我使用的编译器是Borland Delphi 2006我不想说显而易见的事情,但这一定是因为字符串中有空格,也许您可以为自己构建一个函数,并在整个应用程序中进行比较
我的两分钱你为什么不用呢?每当有一个空字符串时,它都会返回0。WideCompareStr如果两个字符串相等,则返回0。So代码:
WideCompareStr(FName,'')<>0
r1和r2均为零,这与预期一致。而您的第二行实际上是一个语法错误(Trim只能接收一个参数)。也许这个测试会对这一问题有所帮助:
procedure TForm1.Button1Click(Sender: TObject);
var
s1: string;
s2: string;
begin
s1 := ' ';
s2 := '';
if WideCompareStr(s1, '') <> 0 then showmessage('s1 test');
if WideCompareStr(s2, '') <> 0 then showmessage('s2 test');
end;
procedure TForm1.按钮1点击(发送方:TObject);
变量
s1:字符串;
s2:字符串;
开始
s1:='';
s2:='';
如果WideCompareStr(s1,')0,则显示消息('s1测试');
如果WideCompareStr(s2),“0”,则显示消息(“s2测试”);
终止
在C++ Builder中,有一个IsVunTye()函数。然而,我看不出如何从Delphi中实现这一点。我刚刚谈到这个话题。我对widestring没有那么深入,如果你纯粹在widestring级别进行比较(不使用pwidechar类型转换),这应该不是问题,但是
我知道有两种空的状态。一个是字符串的指针值为零,另一个是它被分配给某个“XXXX_EMPTYCHAR”#0#0常量。(符号的确切名称可能因德尔福和FPC而异)。如果一些例程使用指针进行比较,可能会出现奇怪的结果。奇怪的是,上面的似乎都是RTL,它通常会仔细检查这一点。WideCompareStr从不返回FALSE!(它不返回布尔值)
相反,如果S1=S2,则返回0
如果是S1 S2,则:
如果S1
或
如果S1>S2,则为正值
另外:在Delphi中,Length从不调用strlen()。所有字符串类型(Shortstring、AnsiString、WideString和UnicodeString*)都包含一个长度字段,该字段为32位整数(Shortstring类型除外,它只有8位)
因此,在除Shortstring之外的所有字符串中,length()调用将首先检查字符串变量是否为NIL,如果为,则立即返回零,否则返回长度字段的内容。绝对没有内存扫描终止空字符
- =UnicodeString类型在Delphi 2009或更新版本中可用。Delphi 2009及更新版本还重新定义了:
类型
trim函数的括号似乎是错误的……因为这使编译器假定您实际上关心字符串的长度。这可能会导致一个代价高昂的StrLen调用,这取决于编译器的实际智能程度?欧欧欧
procedure TForm1.Button1Click(Sender: TObject);
var
s1: WideString;
r1, r2: Integer;
begin
s1 := '';
r1 := WideCompareStr (s1, '');
MessageDlg (IntToStr (r1), mtWarning, [mbOK], 0);
r2 := WideCompareStr (Trim (s1), '');
MessageDlg (IntToStr (r2), mtWarning, [mbOK], 0);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
s1: string;
s2: string;
begin
s1 := ' ';
s2 := '';
if WideCompareStr(s1, '') <> 0 then showmessage('s1 test');
if WideCompareStr(s2, '') <> 0 then showmessage('s2 test');
end;
String = UnicodeString; // in older Delphis: String = AnsiString;
Char = Widechar; // in older Delphis: Char = AnsiChar;