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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |