Нарушение доступа 00000000 при использовании Delete (); - PullRequest
3 голосов
/ 13 апреля 2011

Я пытаюсь удалить каждый символ в начале моей строки, который не является альфа-символом.

Однако , когда в строке присутствуют только не-буквенные символы (например, "!!" или "?!?"), Это приводит к нарушению прав доступа!

Вот мой код:

  // 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 ]

13 голосов
/ 14 апреля 2011

Этот вопрос не имеет ничего общего с 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);
3 голосов
/ 13 апреля 2011

Вы также захотите добавить в проверку, что длина строки> 0 в тесте Пока.

Вы проверяете, является ли он числовым, перед вашим оператором if, чтобы проверить длину строки. В качестве альтернативы вы можете переместить проверку длины строки на После, где вы удалите символ. Однако я хочу это сделать:)

...