0

私のプログラムの一部は、タイプ char のバッファーから ASCII テキストを読み取ります。このバッファー自体には、印刷できない非 ASCII ガベージが含まれている可能性があります。のようにそのような領域を表示するShowMessage(strVar)場合、ヌル文字 ( 0x00) があると、文字列に印刷可能なテキストが含まれていても、文字列は表示されません。

だから私はこの小さな関数を書きました(私はこれらのトリックのために関数を書く習慣を身につけようとしていますが、まだあまり得意ではありません)、印刷できないnull文字の変数をきれいにします:

// 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 では、文字列はゼロ インデックスではなく 1 インデックスであるため、forループは 1 から開始する必要があります。

エラーが発生した場合SIGSEGV、それはアクセス違反に相当する *nix です。(Windows スタイルのダイアログ ボックスにこのメッセージが表示されるのは少し奇妙です!) 通常、これが意味することは、null ポインターを逆参照していることです。

推測する必要がある場合は、内部的にヌル ポインターとして表される空の文字列に対してこのルーチンを実行していたと言えます。文字列の長さが 0 であり、1 から長さではなく 0 から長さへと誤ってループしているため、文字列ポインターを逆参照して配列の要素 0 を取得しようとすると、このエラーが発生します。

于 2013-06-14T23:05:15.920 に答える