Функция компилируется и работает с одними данными, но не работает с другими?

Часть моей программы считывает ASCII-текст из буфера типа char, который сам может содержать какой-то непечатаемый не-ASCII-мусор. При отображении таких областей, как в ShowMessage(strVar), при наличии нулевых символов (0x00) строка не отображается, даже если в ней есть печатный текст.

Итак, я написал эту небольшую функцию (я пытаюсь привыкнуть писать функции для этих трюков, но все еще не очень хорош в этом), чтобы очистить переменную от любых непечатаемых нулевых символов:

// FUNCTION RemoveNullChars : Removes 0x00 from strings, which cause empty string
// fields if not removed sometimes

function TForm1.RemoveNullChars(strValue: string): String;
var
  i : integer;
  NullChar : char;

begin
  NullChar := Chr($00);
  for i := 0 to Length(strValue) do
    begin
    if strValue[i] = NullChar then
      strValue[i] := ' ';
    end;
result := strValue;
end;   

Он компилируется нормально и на самом деле работает с некоторыми сегментами буфера... он действительно удаляет пробелы, но не ВСЕГДА. В других случаях, с другими источниками данных (но источником данных типа времени), я получаю эту ошибку:

введите здесь описание изображения

Я не могу понять, почему он компилируется нормально и действительно работает нормально с некоторыми данными, но не с другими?


person Gizmo_the_Great    schedule 14.06.2013    source источник
comment
Пожалуйста, не добавляйте информацию о теге в заголовок. Система тегов здесь очень хорошо классифицирует вещи и не нуждается в помощи. :-) См. Должны ли вопросы включать теги в свои заголовки?. Спасибо.   -  person Ken White    schedule 15.06.2013
comment
Посмотрите на библиотечную функцию StringReplace (delphibasics.co.uk/RTL.asp?Name =StringReplace)   -  person No'am Newman    schedule 15.06.2013


Ответы (1)


В Паскале строки индексируются единицей, а не нулевым индексом, поэтому ваш цикл for должен начинаться с 1.

Если вы получаете ошибку SIGSEGV, это *nix-эквивалент нарушения прав доступа. (Немного странно видеть это сообщение в диалоговом окне в стиле Windows!) Обычно это означает, что вы разыменовываете нулевой указатель.

Если бы мне пришлось угадывать, я бы сказал, что вы запускаете эту подпрограмму с пустой строкой, которая внутренне представлена ​​как нулевой указатель. Поскольку длина строки равна 0, и вы ошибочно выполняете цикл от 0 до длины вместо 1 до длины, он пытается разыменовать указатель строки и получить элемент 0 массива, и вы получаете эту ошибку.

person Mason Wheeler    schedule 14.06.2013