4

TStringHelper在 Win32 应用程序中使用 ,但是当我尝试访问特定字符或获取子字符串时,如果我使用等效的旧字符串函数,则返回的值是不同的。

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

var
  i : Integer;
  s : string;
begin
  try
    i:=12345678;
    Writeln(i.ToString().Chars[1]);  // returns 2
    Writeln(i.ToString().Substring(1)); //returns 2345678

    s:=IntToStr(i);
    Writeln(s[1]); //returns 1
    Writeln(Copy(s,1,Length(s)));//returns 12345678
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.

问题是为什么 TStringHelper 函数不等同于旧的字符串函数?

4

2 回答 2

11

这是因为 System.SysUtils.TStringHelper 的所有方法和属性都是从零开始的索引,这个帮助程序是带有{$ZEROBASEDSTRINGS ON}指令的编译器。您可以在System.SysUtils.TStringHelper文档中找到更多信息。

于 2013-07-11T03:01:31.160 回答
4

这些TStringHelper函数是从 0 开始的,而不是从 1 开始的。TStringHelper.Chars来自(强调我的)的链接文档:

访问此从零开始的字符串中的单个字符。

从链接TStringHelper.SubString(再次强调我的):

从这个从0开始的字符串中返回从 StartIndex 位置开始并可选地在 StartIndex + Length 位置结束的子字符串(如果指定)。

链接中的代码示例Chars还显示了从0to运行的循环,而不是从to运行Length - 1的通常string循环(代码注释我的):1Length(string)

var
  I: Integer;
  MyString: String;

begin
  MyString := 'This is a string.';

  for I:= 0 to MyString.Length - 1 do  // Note start and end of loop condition
    Write(MyString.Chars[I]);
end.
于 2013-07-11T03:01:26.447 回答