C に似た文字列を処理するルーチンがあり、通常の Delphi 文字列になります。
class function UTIL.ProcessString(const S: string): string;
var
SB:TStringBuilder;
P:MarshaledString;
procedure DoIt(const S:string;const I:Integer=2);
begin
SB.Append(S);
Inc(P,I);
end;
begin
SB:=TStringBuilder.Create;
P:=PChar(S);
while P<>nil do
begin
if P^<>'\' then DoIt(P^,1) else
case (P+1)^ of
'\','"':DoIt((P+1)^);
#0,'n':DoIt(sLineBreak);
't':DoIt(#9);
else DoIt('\'+(P+1)^,2);
end;
end;
Result:=SB.ToString;
SB.Free;
end;
問題は、ループが終了しないことです。デバッグは、while P<>nil do
処理の最後に P が '' であるため、行が False と評価されないことを示しているため、コードは範囲外の操作を実行しようとします。Delphi でのポインタ演算に関する簡潔なドキュメントが見つからなかったので、ここで私が間違っている可能性は十分にあります。
編集:私はそのようにすべてを念頭に置いて関数を書き直しました:
class function UTIL.ProcessString(const S: string): string;
var
SB:TStringBuilder;
P:PChar;
C:Char;
begin
SB:=TStringBuilder.Create;
P:=PChar(S);
repeat
C:=P^;
Inc(P);
case C of
#0:;
'\':
begin
C:=P^;
Inc(P);
case C of
#0,'n':SB.Append(sLineBreak);
'\','"':SB.Append(C);
't':SB.Append(#9);
else SB.Append('\').Append(C);
end;
end;
else SB.Append(C);
end;
until P^=#0;
Result:=SB.ToString;
SB.Free;
end;
#0
内側の case ステートメントで、ルーチンに供給されているかどうかを確認し"such \
strings"
ます。つまり、ソースから読み取られ、1 つずつフォーマットされた断片に分割された文字列のシーケンスです。これまでのところ、これはうまく機能しますが、'\\t'
as'\t'
および同様の構造を正しく解析できず、 #9
. 何か原因が思い浮かびません。ああ、古いバージョンにもこのバグがありました。