我的问题如下:
WideCompareStr(FName,'')<>0
即使FName设置为'',也会返回false。
WideCompareStr(trim(FName),'')<>0
返回所需的结果。为什么我要修剪一个空字符串('')与另一个空标记进行比较以获得正确的结果?
编辑:
清理事物: 我有以下代码来测试宽字符串变量是否为空字符串。
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;
即使FName设置为''(我在调试器中检查过),此函数也返回true。在插入trim(FName)和trim(FInfo)而不是变量之后,它返回了所需的结果。
我错过了必不可少的东西吗?我使用的编译器是Borland Delphi 2006
答案 0 :(得分:7)
如果两个字符串相等,WideCompareStr返回0。所以代码:
WideCompareStr(FName,'')<>0
返回false,因为两个字符串相等,这正是您所期望的(我猜!)。
编辑:
我现在很困惑。我刚刚检查了以下代码:
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;
r1和r2均为零,这与预期一致。而你的第二行实际上是一个语法错误(Trim只能接收一个参数)。
答案 1 :(得分:2)
WideCompareStr NEVER返回FALSE! (它不返回布尔值)
,如果S1 = S2,则返回0。
如果S1&lt;&gt; S2,然后:
如果S1 <1,则它返回负值。 S2或
如果S1> 1,则为正值。 S2。
另外:在Delphi中,Length(S)从不调用strlen()。所有字符串类型(Shortstring,AnsiString,WideString和UnicodeString *)都包含一个长度字段,它是一个32位整数(除了Shortstring类型,它只有8位)。
因此,在除Shortstring之外的所有字符串中,length()调用将首先检查字符串变量是否为NIL,如果是,则立即返回ZERO,否则返回length字段的内容。绝对没有内存扫描终止NULL字符。
型
String = UnicodeString; // in older Delphis: String = AnsiString;
Char = Widechar; // in older Delphis: Char = AnsiChar;
答案 2 :(得分:1)
为什么不简单地使用Length?每当你有一个空字符串时,它将返回零。
答案 3 :(得分:1)
我不是那么深入到宽带中,如果你纯粹在宽带水平上进行比较(不使用pwidechar类型转换),不应该成为问题,但是
我知道,通过ansistrings,有两种状态为空。一个是字符串的指针值是NIL,另一个是它被分配给一些“XXXX_EMPTYCHAR”#0#0常量。 (符号的确切名称可能因Delphi和FPC而异)。如果某些例程使用指针进行比较,则可能会发生奇怪的结果。奇怪的是,上面似乎都是RTL,它通常会仔细检查这个。
答案 4 :(得分:0)
我讨厌陈述显而易见的,但一定是因为你的字符串中有空格,也许你可以构建一个为你做这个的函数,你可以在你的应用程序中进行比较。
我的两分钱
答案 5 :(得分:0)
也许这个测试可以解释这个问题:
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;
答案 6 :(得分:0)
在C ++ Builder中,有一个IsEmpty()函数。但是,我看不出如何从Delphi中获得这个功能。关于这个话题,我只是asked a question。