0

我的程序的一部分从 char 类型的缓冲区读取 ASCII 文本,该缓冲区本身可能包含一些不可打印的非 ASCII 垃圾。当显示这样的区域时,例如 in 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;   

它可以编译,并且实际上可以在某些缓冲区段上工作……它确实可以很好地去除空格,但并非总是如此。其他时候,使用不同的数据源(但数据源的时间类型),我收到此错误:

在此处输入图像描述

我无法弄清楚为什么它可以编译并且实际上在某些数据上可以正常工作,但在其他数据上却不行?

4

1 回答 1

9

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

如果您遇到SIGSEGV错误,那是 *nix 相当于访问冲突。(在 Windows 样式的对话框中看到该消息有点奇怪!)这通常意味着您要取消引用空指针。

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

于 2013-06-14T23:05:15.920 回答