StrPCopy已弃用。有什么选择?

时间:2015-06-26 14:52:01

标签: string delphi

这是我的问题:你如何摆脱这段代码关于StrPCopy被弃用的警告?或者换一种方式 - 我如何摆脱我认为最终会消失的StrPCopy?我根本不想使用AnsiString单元。

program Project2;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

var
    aAmount: array[0..12] of AnsiChar;
    TempStr: string;
begin
    TempStr := '123456789012';
    StrPCopy(aAmount, TempStr);
    WriteLn(aAmount);
    ReadLn;
end.

2 个答案:

答案 0 :(得分:5)

documentationSystem.SysUtils.StrPCopy说:

  

警告:不推荐使用ANSI版本的StrPCopy。请使用AnsiStrings单元。

所以解决方法是改为调用System.AnsiStrings.StrPCopy

顺便说一下,问题中的代码有一个缓冲区溢出。你的数组是一个太短的元素。

好的,现在你已经改变了这个问题。您希望在不使用StrPCopy的情况下实施System.AnsiStrings。那会是这样的:

function StrPCopy(Dest: PAnsiChar; const Source: AnsiString): PAnsiChar;
begin
  Result := Dest;
  Move(PAnsiChar(Source)^, Pointer(Dest)^, Length(Source)+1);
end;

我不太确定你为什么不想使用System.AnsiStrings单位。我没有看到任何明显的理由避开它。

答案 1 :(得分:1)

事实证明,如果没有AnsiStrings单位,您只需执行以下操作:

function NicksStrPCopy(const Source: AnsiString; Dest: PAnsiChar): PAnsiChar;
begin
  Move(PAnsiChar(Source)^, Dest^, Length(Source) + 1); // +1 for the 0 char
  Result := Dest;
end;

这是一个有点低级别,但所有其他有用的例程也在AnsiStrings单元中定义,您要避免。