【问题标题】:Duplicating a char in a string, leaves an empty string在字符串中复制一个字符,留下一个空字符串
【发布时间】:2014-11-05 02:20:05
【问题描述】:

我有这个非常简单的代码,女巫给我留下了一个空字符串。如您所见,它只是复制了“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);

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

【问题讨论】:

  • FileDir.Length-1 可能,或者根据 Low(String) 的值从 1 开始。
  • @Eszee LURD 提供了两个建议,不是一个,请不要说“不起作用”,请准确。
  • 您可以通过从 Low(FileDir) 循环到 High(FileDir) 来使循环与 zbs 无关。

标签: delphi delphi-xe5


【解决方案1】:
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);

【讨论】:

  • 就是这样,谢谢。你能解释一下什么是单基字符串吗?
  • 没关系。我想我是从您编辑的答案中得到的
  • 随着移动编译器的出现,Embarcadero 的语言设计人员决定尝试解决 Delphi 字符串是基于一个(第一个元素的索引为 1)而动态数组是基于零(第一个元素的索引为 0)。移动编译器使用从零开始的字符串。桌面编译器默认使用基于 1 的字符串,但可以切换到基于 0 的模式。 docwiki.embarcadero.com/RADStudio/XE4/en/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 2023-02-23
  • 2021-12-04
  • 2013-04-14
  • 2022-11-30
  • 2012-05-09
  • 1970-01-01
相关资源
最近更新 更多