【问题标题】:zero based String基于零的字符串
【发布时间】:2019-09-19 01:29:00
【问题描述】:

在system.sysutils.pas,在里约他们添加了这条指令:

var intPart: String;

... IntPart.Chars[length(IntPart)] in ['1','3','5','7','9'] ...

但据我所知,s.Chars[xx] 将始终是从零开始的字符串,因此IntPart.Chars[length(IntPart)] in ['1','3','5','7','9'] 将始终退出边界?

不能改写

... IntPart.Chars[length(IntPart)-1] in ['1','3','5','7','9'] ...

或者我错过了什么?

【问题讨论】:

  • @NasreddineGalfout 没有 IntPart 是一个字符串,无论如何为什么要在 ['1','3','5','7','9'] 中比较 #0 ....跨度>
  • 是的,String.Chars[] 在从零开始的字符串上运行。见SysUtils.TStringHelper.Chars。有问题的代码应该使用Length(intPart)-1 来获取字符串中的最后一个字符。设置范围检查,但不会引发异常。
  • 所以你发现了两个bug,SysUtils.InternalTextToCurrency中最后一个字符的无效检查,TStringHelper.Chars中的缺失范围检查。
  • 文档也是错误的。同样:没有从零开始的字符串,只是它们的索引方式不同。 same 字符串可以从零开始或从一开始索引,具体取决于设置。 TStringHelper 不是为了对从零开始的字符串进行操作而编写的。它使用从零开始的索引。 TStringHelper 可以对任何 UnicodeString 进行操作,无论使用哪种设置,并且始终为字符串呈现一个从零开始的接口。
  • 除了在这里讨论有多少天使可以在一个针点上跳舞之外:有人会就此提交错误报告吗?

标签: delphi delphi-10.3-rio


【解决方案1】:

但据我所知,s.Chars[xx] 将始终是从零开始的字符串

是的,TStringHelper 例程被编写为从零开始对字符串进行操作,无论编译器设置如何 ({$ZEROBASEDSTRINGS ON/OFF})。见SysUtils.TStringHelper.Chars。

所以在 ['1','3','5','7','9'] 中执行 IntPart.Chars[length(IntPart)] 将始终超出边界?

没错。应该是Length(IntPart)-1。

报告为: SysUtils.InternalTextToCurrency accesses a string out of bounds

更新:已在 Delphi 10.3.3 Rio 中修复。


此外,当范围检查开启时,IntPart.Chars[length(IntPart)] 应该引发异常。这也是错误(TStringHelpers.Chars)。

报告为: TStringHelper.Chars does not issue a range error when index is out of bounds

【讨论】:

    猜你喜欢
    • 2013-04-24
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    相关资源
    最近更新 更多