如何编写Delphi过程来修改适用于PCHAR和字符串的字符串?

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 ......

Rem*_*eau 5

我不建议在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)

更新:如果你真的想为这两个PCharString输入使用单个实现,那么你可以这样做:

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)