Giz*_*eat 0 delphi freepascal lazarus
我的程序的一部分从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;
Run Code Online (Sandbox Code Playgroud)
它编译好,实际上在一些缓冲段上工作......它确实剥离了空格,但并不总是如此.其他时候,使用不同的数据源(但时间类型的数据源),我收到此错误:

我无法弄清楚为什么它编译好然而实际上对某些数据运行正常但对其他数据没有效果?
在Pascal中,字符串是一个索引,而不是零索引,因此您的for循环应该从1开始.
如果您收到SIGSEGV错误,那就是*nix相当于访问冲突.(在Windows风格的对话框中看到该消息有点奇怪!)这意味着您通常会取消引用空指针.
如果我不得不猜测,我会说你在一个空字符串上运行这个例程,它在内部表示为空指针.因为字符串的长度是0,并且您错误地从0循环而不是1到长度,它会尝试取消引用字符串指针并检索数组的元素0,并且您得到此错误.