2013-07-11 163 views
4

我在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 
    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

TStringHelper函数是从0开始的,而不是从1开始的。从TStringHelper.Chars重点煤矿)链接的文档:

访问这个从零开始单个字符。

从链接TStringHelper.SubString(再次,重点煤矿):

返回字符串开始处的位置开始索引和可选的位置开始索引+长度结束,如果指定,从这个基于0的字符串

Chars链路的代码示例还示出,而不是通常string循环运行从1Length(string)(代码注释矿)运行从0Length - 1环路,:

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. 
+5

首先引入'TStringHelper'的全部原因是在不破坏现有代码的向后兼容性的情况下创建基于0的字符串操作。英巴卡迪诺正试图缓慢地将RTL转向基于0的字符串处理。 –

相关问题