使用Delete()时访问违规00000000;

时间:2011-04-13 19:58:23

标签: string delphi char access-violation

我试图删除字符串开头的每个字符,这不是字母字符。

然而,如果字符串中只有非字母字符(例如“!!”或“?!?”),则会发出访问冲突!

这是我的代码:

  // The Log(); is a routine that adds stuff to my log memo.
  Log('Begin Parse');
  while not IsLetter(ParsedName[1]) do
   begin
     Log('Checking Length - Length is '+IntToStr(Length(ParsedName))+' ...');
     if Length(ParsedName) <> 0 then
     Begin
     Log('Deleting Char ...');
     Delete(ParsedName,1,1);
     Log('Deleted Char ...');
     End;
     Log('Checking Length - Length is now '+IntToStr(Length(ParsedName))+' ...');
   end;
   // It never reaches this point!
   Log('End Parse');

这是我的日志产生的:

21:51:19: Checking Length - Length is 2 ...
21:51:19: Deleting Char ...
21:51:19: Deleted Char ...
21:51:19: Checking Length - Length is now 1 ...
21:51:19: Checking Length - Length is 1 ...
21:51:19: Deleting Char ...
21:51:19: Deleted Char ...
21:51:19: Checking Length - Length is now 0 ...
21:51:19: Access violation at address 007A1C09 in module 'Project1.exe'. Read of address 00000000 

如您所见,它在所有字符被删除后立即发生。我认为问题在于,不知何故,我试图访问不存在的东西,但如何我这样做,我看不到。

编辑:是的,我知道这是一个愚蠢的问题以及所有这些 - 我只是监督了一些事情。不要告诉我,不要发生在你身上;)

2 个答案:

答案 0 :(得分:13)

此问题与Delete无关。即使您告诉它删除不存在的字符,删除仍然有效。

该行

while not IsLetter(ParsedName[1]) do

尝试访问ParsedName[1],因此这个角色最好存在。你的代码不是特别漂亮,但是一个简单的解决方法就是

while (length(ParsedName) > 0) and not IsLetter(ParsedName[1]) do

你可以做到

while (length(ParsedName) > 0) and not IsLetter(ParsedName[1]) do
  Delete(ParsedName, 1, 1);

答案 1 :(得分:3)

您还需要添加一个检查字符串的长度为&gt;在while测试中为0。

您正在检查if语句之前是否为数字,以检查字符串的长度。或者,您可以将对字符串长度的检查移动到删除字符后的位置。不过你想这样做:))