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;