【问题标题】:Delphi - AnsiString Not Equal but dont know whyDelphi - AnsiString 不等于但不知道为什么
【发布时间】:2023-03-05 14:56:01
【问题描述】:

我有一个 Tree 迭代的比较运算符。它使用 AnsiString 变量。我的问题是,当值看起来相等时,我没有得到相等的指示符(也就是没有从 System.AnsiStrings.CompareStr 得到 0)。我已经通过调试器查看了我的变量并单步执行了我的代码。两个变量都是 AnsiStrings,都是相同的值,并且没有空格。如果有帮助,CompareStr 返回 -65。

我可以忽略什么?这是我的代码。

  function CompareNodes(idVal: pointer; ANode: TALStringKeyAVLBinaryTreeNode): Integer;
  var
    Key1, Key2: AnsiString;
  begin
    Key1 := PAnsiString(idVal)^;
    Key2 := ANode.ID;

    Result := System.AnsiStrings.CompareStr(Key1, Key2);
  end;

【问题讨论】:

  • 这里不足以重现问题。
  • 找到我的答案....不知何故,一个字符串被用于输入,而不是 AnsiString。当这种情况发生时,-65 可能是一个指标......
  • 输入很可能是用UnicodeString 完成的,然后转换为AnsiString,因此数据可能“看起来”类似于人眼,但实际上在记忆中完全不同,CompareStr() 会注意。在调试器中查看字符串值是不够的,您必须查看原始字节。 65 的差异可能意味着您正在处理 ASCII 范围之外的 ANSI 字符。
  • 您的字符串不同 - 就这么简单。请记住CompareStr 也要求大小写相同。使用CompareText 进行不区分大小写的比较。如果您仍在苦苦挣扎,我对同一问题的回答将告诉您如何找出不同之处:stackoverflow.com/a/24390357/224704

标签: delphi ansistring


【解决方案1】:

两个变量都是AnsiStrings,都是相同的值,并且没有空格。

您似乎弄错了,CompareStr 另有说法。两个字符串不相等。在这种情况下,最好是怀疑自己,而不是怀疑库函数不正确。

这里的第 1 步是添加一些调试代码。当解释为二进制时输出这两个字符串。将每个字符的序数值写入调试日志。这将揭示差异。

如果有帮助,CompareStr 返回 -65。

CompareStr 的实现逐个字符比较并查看序数值之间的差异。只要差值始终为零,那么算法就可以继续下一个值。但是当找到一个非零值时,字符串是不同的并且返回该非零值。因此,第一个不同的字符的序数值相差 65。

【讨论】:

    【解决方案2】:

    有趣的是,65 是A#0 之间的差异。

    由于Key1 := PAnsiString(idVal)^; 行对idVal 指针执行unchecked 类型转换,idVal 实际上可能指的是Wide/Unicode 字符串。这意味着Key1 正试图将 non AnsiString 视为一个。

    基于 OP 的 comment:

    找到我的答案....不知何故,一个字符串被用于输入,而不是 AnsiString。当这种情况发生时,-65 可能是一个指标......

    这正是问题所在。

    【讨论】:

    • 如果用户进行了一些调试,这将非常明显
    猜你喜欢
    • 2018-09-10
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    相关资源
    最近更新 更多