Emm*_*iah -2 delphi string pchar
举一个例子,假设我想写一个简单的过程,从字符串中删除'X'字符.
如何设计我的程序,使其适用于字符串和PCHAR参数.
如果我将其定义为:
程序RemoveX(来源:PCHAR);
比调用RemoveX(PCHAR(mystring)),其中myString是一个字符串将删除'X'但不会更新字符串长度...因此后续的myString:= myString +'done'将保持myString不变.并且我不想在调用RemoveX之后更改长度,我希望RemoveX过程能够处理所有事情.
另一方面,如果我将其定义为:
procedure RemoveX(var source:string);
我不知道怎么把它传给PCHAR ......
我不建议在string版本方面实现PChar版本,反之亦然.我会将它们分开,以便您可以独立定制它们,例如:
procedure RemoveX(source : PChar); overload;
procedure RemoveX(var source : string); overload;
Run Code Online (Sandbox Code Playgroud)
procedure RemoveX(source : PChar);
var
P: PChar;
Len: Integer;
begin
if source = nil then Exit;
Len := StrLen(source);
repeat
P := StrScan(source, 'X');
if P = nil then Exit;
StrMove(P, P+1, Len - Integer(P-source));
Dec(Len);
source := P;
until False;
end;
procedure RemoveX(var source : string);
begin
source := StringReplace(source, 'X', '', [rfReplaceAll]);
end;
Run Code Online (Sandbox Code Playgroud)
更新:如果你真的想为这两个PChar和String输入使用单个实现,那么你可以这样做:
function RemoveX(source : PChar; sourceLen: Integer): Integer; overload;
procedure RemoveX(source : PChar); overload;
procedure RemoveX(var source : string); overload;
Run Code Online (Sandbox Code Playgroud)
function RemoveX(source : PChar; sourceLen: Integer): Integer;
var
P: PChar;
begin
Result := 0;
if (source = nil) or (sourceLen = 0) then Exit;
repeat
P := StrScan(source, 'X');
if P = nil then Exit;
StrMove(P, P+1, sourceLen - Integer(P-source));
Dec(sourceLen);
source := P;
until False;
Result := sourceLen;
end;
procedure RemoveX(source : PChar);
begin
RemoveX(source, StrLen(source));
end;
procedure RemoveX(var source : string);
begin
UniqueString(source);
SetLength(source, RemoveX(PChar(source), Length(source)));
end;
Run Code Online (Sandbox Code Playgroud)