加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 如何使用Move连接多个字符串?

发布时间:2020-12-15 04:17:49 所属栏目:大数据 来源:网络整理
导读:如何使用Move连接字符串数组.我试过这个,但我无法想象如何让Move操作正常工作. program Project2;{$POINTERMATH ON}procedure Concat(var S: String; const A: Array of String);var I,J: Integer; Len: Integer;begin Len := 0; for I := 0 to High(A) do L
如何使用Move连接字符串数组.我试过这个,但我无法想象如何让Move操作正常工作.
program Project2;

{$POINTERMATH ON}

procedure Concat(var S: String; const A: Array of String);
var
  I,J: Integer;
  Len: Integer;
begin
  Len := 0;
  for I := 0 to High(A) do
  Len := Len + Length(A[I]);

  SetLength(S,Length(S) + Len);

  for I := 0 to High(A) do
  Move(PWideChar(A[I])[0],S[High(S)],Length(A[I]) * SizeOf(WideChar));
end;

var
  S: String;
begin
  S := 'test';
  Concat(S,['test','test2','test3']);
end.

解决方法

我会像这样编写这个函数:
procedure Concat(var Dest: string; const Source: array of string);
var
  i: Integer;
  OriginalDestLen: Integer;
  SourceLen: Integer;
  TotalSourceLen: Integer;
  DestPtr: PChar;
begin
  TotalSourceLen := 0;
  OriginalDestLen := Length(Dest);
  for i := low(Source) to high(Source) do begin
    inc(TotalSourceLen,Length(Source[i]));
  end;
  SetLength(Dest,OriginalDestLen + TotalSourceLen);

  DestPtr := PChar(Pointer(Dest)) + OriginalDestLen;
  for i := low(Source) to high(Source) do begin
    SourceLen := Length(Source[i]);
    Move(Pointer(Source[i])^,DestPtr^,SourceLen*SizeOf(Char));
    inc(DestPtr,SourceLen);
  end;
end;

这是相当不言自明的.并发症是由空弦引起的.在启用范围检查时,任何索引空字符串字符的尝试都将导致异常.

要处理该复杂性,您可以添加if测试用于Move调用中涉及的其中一个字符串为空的情况.我更喜欢不同的方法.我宁愿将字符串变量强制转换为指针.绕过范围检查但也允许省略if语句.

Move(Pointer(Source[i])^,SourceLen*SizeOf(Char));

有人可能想知道如果Source [i]为空,会发生什么.在这种情况下,Pointer(Source [i])为nil,您可能会遇到访问冲突.实际上,没有错误,因为第三个参数指定的移动长度为零,并且nil指针实际上从未被引用.

另一行注意到:

DestPtr := PChar(Pointer(Dest)) + OriginalDestLen;

我们使用PChar(指针(Dest))而不是PChar(Dest).后者调用代码来检查Dest是否为空,如果是,则产生指向单个空终止符的指针.我们希望避免执行该代码,并直接获取Dest中保存的地址,即使它是nil.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读