我在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函数不等同于旧的字符串函数?
答案 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
链接的代码示例还显示了从0
到Length - 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.