复制字符串中的char,留下一个空字符串

时间:2014-09-11 08:05:32

标签: delphi delphi-xe5

我有这个非常简单的代码,我留下一个空字符串。正如您所看到的,它只是复制了'FileDir'字符串中的每个'\'。当我打电话给'Showmessage(FileDir)'时,我得到一个空盒子。但是,当我在循环中调用'Showmessage(FileDir [I])'时,我确实得到了char。

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);

很可能我没有看到明显的,所以也许你们其中一个人。提前致谢

1 个答案:

答案 0 :(得分: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);