簡體   English   中英

不建議使用StrPCopy。 有什么選擇?

[英]StrPCopy is deprecated. What is the alternative?

這是我的問題:您如何擺脫此代碼給出的關於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.

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單元。 我看不出有任何明顯的理由回避它。

事實證明,您想要在沒有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單元中定義,您要避免。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM