2014-09-11 141 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