TStringHelper没有返回正确的结果

时间:2013-07-11 02:57:01

标签: delphi delphi-xe4

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

{$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函数不等同于旧的字符串函数?

2 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:4)

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

  

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

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

  

从此 0-based string 返回从StartIndex位置开始的子字符串,并可选择从StartIndex + Length位置(如果已指定)结束。

来自Chars链接的代码示例还显示了从0Length - 1的循环,而不是从string运行的常规1循环到Length(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.