gpt4 book ai didi

string - 如何将一个字符串复制到另一个字符串中,使字符串保留在第一个位置?

转载 作者:行者123 更新时间:2023-12-03 19:42:04 24 4
gpt4 key购买 nike

procedure Split(S: String; List: TStringList; Separator: Char);
var
P, C: PAnsiChar;
S, Buff: String;
begin
List.Clear;

if S = '' then
Exit;

List.BeginUpdate;

(* [Ajusting size - Slow *)
if S[1] = Separator then
Insert('', S, 1);

S := S + Separator;
(* Adjusting size] *)

//Get Pointer to data
P := PChar(S);

//initial position
C := P;
while P^ <> #0 do //check if reached the end of the string
begin
//when found a separator
if P^ = Separator then
begin
if P = C then //check if the slot is empty
Buff := ''
else //when it is not empty, make an string buffer
SetString(Buff, C, P-C);

List.Add(Buff); //add the string into the list
Inc(C, P-C+1); //moves the pointer C to the adress of the pointer P
end;

Inc(P); //go to next char in the string
end;

List.EndUpdate;
end;


这段代码可以正常工作,但是在内存中将字符串移动了3次:

在方法调用中(按副本)
在Insert('',S,1)中
在串联中:S:= S +分隔符;

我考虑过在S参数中添加const关键字,创建一个内部字符串来大致复制数据,如下所示:

  if S[1] = Separator then
begin
SetLength(Str, Length(S)+2);
//HERE!! how to copy the string
Str[1] := ' ';
end
else
begin
SetLength(Str, Length(S)+1);
//HERE!! how to copy the string
end;

//Add Separator in the last position
Str[Length(Str)] := Separator;


从而:

如果S包含';'
它将创建一个包含2个项目(“,”)的字符串列表。
如果S包含'; A'
它将创建一个包含2个项目的字符串列表('','A')。
如果S包含'A; A'
它将创建一个包含2个项目(“ A”,“ A”)的字符串列表。
如果S包含“ A”;
它将创建一个包含2个项目(“ A”,“)的字符串列表。

最佳答案

像这样:

if S[1] = Separator then
begin
SetLength(Str, Length(S)+2);
Move(Pointer(S)^, Str[2], Length(S)*SizeOf(Char));
S[1] := ' '; // surely you mean Str[1] := ' '
end
else
begin
SetLength(Str, Length(S)+1);
Move(Pointer(S)^, Str[1], Length(S)*SizeOf(Char));
end;

//Add Separator in the last position
Str[Length(Str)] := Separator;


对其进行重新加工以避免重复是很容易的。

var
dest: PChar;

if S[1] = Separator then
begin
SetLength(Str, Length(S)+2);
dest := @Str[2];
S[1] := ' '; // surely you mean Str[1] := ' '
end
else
begin
SetLength(Str, Length(S)+1);
dest := @Str[1];
end;
Move(Pointer(S)^, dest^, Length(S)*SizeOf(Char));

//Add Separator in the last position
Str[Length(Str)] := Separator;


等等。我会把它留给你抛光。

关于string - 如何将一个字符串复制到另一个字符串中,使字符串保留在第一个位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17470541/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com