Delphi中的空字符串

时间:2009-06-19 11:29:06

标签: delphi

我的问题如下:

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

7 个答案:

答案 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字符。

  • = UnicodeString类型在Delphi 2009或更高版本中可用。 Delphi 2009和更新版也重新定义:

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