سلام
من یک رشته کد اسکی دارم که میخوام بعضی کارکترها رو در اون با کارکترهای دیگه جایگزین کنم. مثلاA رو B کنم.
ساده ترین روش استفاده از دو رشته و استفاده از Pos هست:
Procedure ChangeChars(Var S:String);
Var
A,B:String;
I,P:Integer;
begin
A:=#45#67#123;
B:=#46#69#130;
For I:=1 To Length(S) Do
Begin
P:=Pos(S[I],A);
If P>0 then
S[I]:=B[P];
End;
end;
اما این روش کند هست. روش دیگه تعریف همه کارکترها و جایگزینی با استفاده از کد اسکی به عنوان اندیس آرایه هست:
Procedure ChangeChars2(Var S:String);
Var
A,B:String;
I:Integer;
Ch:Array[0..255]of Chars;
begin
For I:=0 To 255 Do
Ch[I]:=Chr(I);
A:=#45#67#123;
B:=#46#69#130;
For I:=1 To Lenght(A) Do
Ch[Ord(A[I])]:=B[I];
For I:=1 To Lenght(S) Do
S[I]:=Ch[Ord(S[I])];
end;
این روش هم به نظرم سریعترین روش نیست.اگر میشد از اشاره گر PChar یا PByteArray استفاده کرد بهتر بود. ولی روشش رو بلد نیستم.
Procedure ChangeChars3(Var S:String);
Var
A,B:String;
I:Integer;
Ch256:String;
P1,P2:PChar;
begin
For I:=0 To 255 Do
Ch256:=Ch256+Chr(I);
A:=#45#67#123;
B:=#46#69#130;
For I:=1 To Length(A) Do
Ch256[Ord(A[I])]:=B[I];
P1:=PChar(S);
P2:=PChar(Ch256);
For I:=1 To Length(S) Do
P1[I]:=P2[P1[I]^];
end;
سعی کردم از PByteArray برای P2 استفاده کنم باز هم نشد!
Procedure ChangeChars4(Var S:String);
Var
A,B:String;
I:Integer;
Ch256:String;
P1:PChar;
P2:PByteArray;
begin
For I:=0 To 255 Do
Ch256:=Ch256+Chr(I);
A:=#45#67#123;
B:=#46#69#130;
For I:=1 To Length(A) Do
Ch256[Ord(A[I])]:=B[I];
P1:=PChar(S);
P2:=@Ch256;
For I:=1 To Length(S) Do
P1[I]:=P2[P1[I]];
end;
فقط میخوام Ord استفاده نکنم