2014-09-11 138 views
1

我有這個非常簡單的代碼巫婆給我留下了一個空字符串。正如你所看到的,它簡單地複製了'FileDir'字符串中的每個'\'。當我調用'Showmessage(FileDir)'時,我得到一個空框。但是,當我在我的循環中調用'Showmessage(FileDir [I])'時,我得到了字符。在一個字符串複製一個字符,留下一個空字符串

var 
    s, FileDir: string; 
    I: integer; 

for I := 0 to FileDir.Length do 
begin 
    if FileDir[I] = '\' then 
    s := s + '\'; 
    s := s + FileDir[i]; 
end; 
FileDir := s; 
Showmessage(FileDir); 

我已經編輯我的代碼把字符串中的編輯框,然後將其複製到我的「FILEDIR」字符串。這工作,但我不滿意

for I := 0 to FileDir.Length do 
begin 
    if FileDir[I] = '\' then 
    edbox.Text := edbox.Text + '\'; 
    edbox.Text := edbox.Text + FileDir[i]; 
end; 
FileDir := edbox.Text; 
Showmessage(FileDir); 

這很可能我沒有看到明顯的,所以也許你們中的一個呢。在此先感謝

+0

FileDir.Length-1更換也許,或從1取決於低(串)的值開始。 – 2014-09-11 08:15:58

+0

@Eszee LURD提供了兩個建議,而不是一個,請不要說「不工作」,請準確。 – 2014-09-11 08:22:35

+1

您可以通過從Low(FileDir)循環到High(FileDir)來製作循環zbs-agnostic。 – 2014-09-11 08:22:59

回答

4
for I := 0 to FileDir.Length do 

在這裏你遍歷FileDir.Length+1字符,這顯然不是你的意圖。如果您使用的是基於零串迴路應

for I := 0 to FileDir.Length-1 do 

或者,如果你的字符串,然後基於一個應該是

for I := 1 to FileDir.Length do 

當我打電話「Showmessage(FILEDIR)」,我得到一個空盒子。

這似乎表明,當您訪問索引爲零的元素時,出界限訪問是這樣的,因此您的字符串似乎是傳統的基於字符串的字符串。


故事的真正寓意是你需要在編譯器選項中啓用範圍檢查。一旦你這樣做了,編譯器將發出診斷代碼,當你執行越界數組訪問時,這些代碼將會引發信息錯誤。


你的代碼可以全部由

FileDir := StringReplace(FileDir, '\', '\\', rfReplaceAll); 
+0

就是這樣,謝謝。你能解釋一下一個基本字符串是什麼嗎? – Eszee 2014-09-11 08:23:57

+0

沒關係。我想,我是從你的編輯答案 – Eszee 2014-09-11 08:26:18

+0

隨着移動編譯器的出現,語言設計者在Embarcadero公司已決定嘗試解決的矛盾,德爾福字符串是一個基礎的(第一個元素的索引爲1)的基礎,而動態數組是零(第一個元素有索引0)。移動編譯器使用零字符串。桌面編譯器默認爲一個基於字符串的字符串,但可以切換到基於零的模式。 http://docwiki.embarcadero.com/RADStudio/XE4/en/Migrating_Delphi_Code_to_iOS_from_Desktop#Use_0-Based_Strings – 2014-09-11 08:26:52