2013-07-11 161 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的字符串處理。 –

相關問題