我有这个非常简单的代码,我留下一个空字符串。正如您所看到的,它只是复制了'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);
很可能我没有看到明显的,所以也许你们其中一个人。提前致谢
答案 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);