Delphi 函数编译并处理某些数据,但不处理其他数据?

Delphi 函数编译并处理某些数据,但不处理其他数据?,delphi,freepascal,lazarus,Delphi,Freepascal,Lazarus,我程序的一部分从char类型的缓冲区读取ASCII文本,缓冲区本身可能包含一些不可打印的非ASCII垃圾。显示此类区域时,例如在ShowMessage(strVar)中,如果存在空字符(0x00),则即使字符串中有可打印文本,也不会显示该字符串 因此,我编写了这个小函数(我试图养成为这些技巧编写函数的习惯,但仍然不是很擅长),以清除变量中任何不可打印的空字符: // FUNCTION RemoveNullChars : Removes 0x00 from strings, which cause

我程序的一部分从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;   
它编译得很好,实际上可以在一些缓冲区段上工作……它确实可以很好地去掉空格,但并不总是这样。其他时候,使用不同的数据源(但时间类型的数据源),我会出现以下错误:


我搞不明白为什么它编译正常,并且在某些数据上实际工作正常,但在其他数据上却不工作

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

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


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

请不要在标题中放置标记信息。这里的标签系统非常擅长分类,不需要帮助。:-)请看。谢谢。请看库StringReplace函数()