这是我的问题:你如何摆脱这段代码关于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.
答案 0 :(得分:5)
documentation的System.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
单元中定义,您要避免。