【问题标题】:If statement for checking strings用于检查字符串的 if 语句
【发布时间】:2014-06-24 14:39:54
【问题描述】:

所以我试图确定两个不同的字符串是否与

相同
 if DerobModel.ConstructionCount > 22 then
 begin
   for i := 22 to DerobModel.ConstructionCount-1 do
   begin
     ConstructionName[i] := DerobModel.Constructions[i].Name;
     ShowMessage(ConstructionName[i]);
     ShowMessage(DerobModel.HouseProperties.StringValue['NWall']);
     if ConstructionName[i]=DerobModel.HouseProperties.StringValue['NWall'] then
     begin
       ShowMessage('Hej');
       igSurf[0]:=idWallCon[i];
     end;
     LayerCount[i] := DerobModel.Constructions[i].LayerCount;
     idWallCon[i] := i+1;
   end;
 end;

两个字符串的 ShowMessage 返回相同的字符串,但不知何故它不会进入 if 语句。有什么想法吗?

【问题讨论】:

  • 好吧,那么显然ConstructionName[i]DerobModel.HouseProperties.StringValue['NWall'] 不是同一个字符串。由于您没有向我们展示它们中的任何一个是什么,因此很难诊断出它们的不同之处,但使用调试器肯定很容易弄清楚。
  • @KenWhite 如您所见,ConstructionName[i] 的名称来自 DerobModel.Constructions[i].Name。这个名字也在一个组合框中,我得到DerobModel.HouseProperties.StringValue['NWall']DerobModel.HouseProperties.StringValue['NWall']:=NWallComboBox.Items.GetText; 你如何建议我使用调试器?我在那里放了一个断点,但它只是跨过它。显示的两条消息都显示相同的字符串,即“BetongVägg”
  • 除了我之前写的,我什么都看不到,因为你没有提供任何实际值。请再次阅读我写的内容(以及大卫在他的回答中写的内容,这与我所说的相同)。如果= 没有找到匹配项,则字符串不一样。 使用调试器并在运行时检查它们,看看有什么不同;我向你保证他们实际上是不同的。
  • 有效的调试大概是至少50%的观察。在注意到字符串的长度不同之前,不应该占用一个充满 cmets 和答案的页面,尤其是因为从调试器中获取这些信息非常容易。除此之外,在显示字符串值以进行调试时(即使在 IDE 的监视窗口中),养成使用 > 和
  • 谢谢@KenWhite 我现在看到字符串的不同之处在于DerobModel.HouseProperties.StringValue['NWall'] 字符串也包含“#$D#$A”。通过在线查看,似乎从 ComboBox 获取字符串的人遇到了这个问题。假设它总是这样,所以我可以对字符串使用 StringReplace 是否安全?

标签: delphi


【解决方案1】:

已知字符串的= 运算符可以工作。当字符串s1s2 相等时,s1 = s2 评估为真。否则它评估为假。众所周知,= 运算符在所有版本的 Delphi 中都能正常工作。

得出的结论是,如果你的if 的主体没有执行,那么这两个字符串不相等。现在您知道两个字符串不相等,您可以调试程序来找出为什么您认为相等的两个事物实际上不相等。

请注意,= 的相等性测试是准确的。字母大小写很重要。空白很重要。以此类推。

【讨论】:

  • 两个字符串的值都来自同一个来源,只是不同。正如我在上面对 KenWhite 评论的那样,两个 ShowMessage 命令都给出了相同的结果,这就是为什么我不明白为什么它不会执行 if
  • 我不会重复 Ken 所说的以及我在回答中所写的内容。如果您不能接受,则需要与您的 SSCCE 一起提交 QC 报告。
  • 我不是想说你错了,但我不明白为什么当我在消息框中看到它们时它们是一样的,大写和所有。我也不明白调试器能为我做什么。 IE。使用 MatLAB 时,我可以只键入变量并获取值,但我无法为 Delphi 找到一种方法。
  • ShowMessage 不会向您显示任何可能的空白(如果有)。调试器设计有非常广泛的工具来帮助您,请学习如何使用它。
  • 字符串不同。查看底层字节。使用调试器。
【解决方案2】:

你的字符串不一样,就这么简单。
如果你想弄清楚到底有什么不同,你可以写一个 else 块部分来详细比较字符串并告诉你到底有什么不同。

if ConstructionName[i]=DerobModel.HouseProperties.StringValue['NWall'] then
begin
  ShowMessage('Hej');
  igSurf[0]:=idWallCon[i];
end
else
begin
  if (Length(ConstructionName[i]) <> 
      Length(DerobModel.HouseProperties.StringValue['NWall'])) then
  begin
    ShowMessage('Length('+IntToStr(Length(ConstructionName[i]))+') <> Length('+
                IntToStr(Length(DerobModel.HouseProperties.StringValue['NWall']))+')');
  end
  else
  begin
    for LCharPos := 1 to Length(ConstructionName[i]) do
    begin
      if (ConstructionName[i][LCharPos] <> 
          DerobModel.HouseProperties.StringValue['NWall'][LCharPos]) then
      begin
        //Here you might need to rather show the ordinal values of the 
        //characters to see the difference if they **look** the same due 
        //to the font of the message.
        ShowMessage('Pos['+IntToStr(LCharPos)+'] "'+
                    ConstructionName[i][LCharPos]+'" <> "'+
                    DerobModel.HouseProperties.StringValue['NWall'][LCharPos]+'"');
      end;
    end;
  end;
end;

我能想到的唯一可能会意外导致“相同”字符串被报告为不同的情况是:如果它们是不同的字符串类型。例如。如果一个是 WideString 另一个是 AnsiString,那么:

  • 必须进行隐式转换才能进行比较。
  • 这意味着其中一个字符串将被更改。
  • 此更改可能会导致两个看起来相同的字符串实际上不同。

【讨论】:

  • 谢谢!现在看来,DerobModel.HouseProperties.StringValue['NWall'] 似乎长了 2 个字符。你认为 DerobModel.HouseProperties.StringValue['NWall']:=NWallComboBox.Items.GetText 可以吗?
  • @user3464658 我对此表示怀疑。根据我的经验,GetText 总是返回与我分配的完全相同的值。如果您在设计时设置了字符串值,请仔细检查您是否在每行中都没有多余的空格。
  • 2 个字符长 - 然后找出哪两个字符。
  • 如果你把它放在一个接收两个字符串参数s1,s2的函数中,这段代码会简单得多。
  • @David 我特别选择不使用函数,因为我不知道 OP 代码中使用的类型。 (我什至不知道他是否使用 >= D2009)一个函数可能会导致一个或两个字符串的隐式转换,并对练习产生不利影响。
猜你喜欢
  • 2015-12-02
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
  • 2017-03-09
相关资源
最近更新 更多