函数编译并处理一些数据而不是其他数据?

时间:2013-06-14 22:59:42

标签: delphi freepascal lazarus

我程序的一部分从char类型的缓冲区读取ASCII文本,它本身可以包含一些不可打印的非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;   

它编译好,实际上在一些缓冲段上工作......它实际上确实剥离了空格,但并不总是如此。其他时候,使用不同的数据源(但时间类型的数据源),我收到此错误:

enter image description here

我无法弄清楚为什么它编译好然而实际上对某些数据运行正常但对其他数据没有效果?

1 个答案:

答案 0 :(得分:9)

在Pascal中,字符串是单索引的,而不是零索引的,因此您的for循环应该从1开始。

如果您收到SIGSEGV错误,那就是* nix相当于访问冲突。 (在Windows风格的对话框中看到这条消息有点奇怪!)这意味着你通常会取消引用一个空指针。

如果我不得不猜测,我会说你在一个空字符串上运行这个例程,它在内部表示为空指针。因为字符串的长度是0,并且您错误地从0循环而不是1到长度,它会尝试取消引用字符串指针并检索数组的元素0,并且您会收到此错误。