Delphi TStringHelper未返回正确的结果
我在Win32应用程序中使用的是Delphi TStringHelper未返回正确的结果,delphi,delphi-xe4,Delphi,Delphi Xe4,我在Win32应用程序中使用的是TStringHelper,但当我尝试访问特定的字符或获取子字符串时,如果使用等效的旧字符串函数,返回的值将不相同 {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; var i : Integer; s : string; begin try i:=12345678; Writeln(i.ToString().Chars[1]); // returns 2 Wri
TStringHelper
,但当我尝试访问特定的字符或获取子字符串时,如果使用等效的旧字符串函数,返回的值将不相同
{$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函数不等同于旧的字符串函数?这些函数是基于0的,而不是基于1的。从TStringHelper.Chars
(emphasis mine)的链接文档中:
访问此零基字符串中的单个字符
从(同样,强调我的)的链接:
从该基于0的字符串中返回从位置StartIndex开始并可选地以位置StartIndex+长度结束的子字符串(如果指定)
Chars
链接中的代码示例还显示了从0
到Length-1
的循环,而不是从1
到Length(string)
的普通string
循环:
这是因为System.SysUtils.TStringHelper的所有方法和属性都是基于零的索引,此帮助程序是带指令的编译器。您可以在文档中找到更多信息。首先引入TStringHelper的全部原因是创建基于0的字符串操作,而不破坏与现有代码的向后兼容性。Embarcadero正试图慢慢地将RTL向基于0的字符串处理方向移动。
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.