Delphi 使用偏移量在部分字符串中使用 CopyMemory 拆分字符串
Delphi Split a string with CopyMemory in part-strings using an offset
我想在 X 部分字符串中拆分一个字符串。
到目前为止,这是我的代码:
procedure SplitFile(var a: StringArray; len: integer; fileString: AnsiString; numberParts: integer);
var
i, Rest, partSize: integer;
tmp: AnsiString;
begin
Rest := len mod numberParts;
SetLength(a, numberParts);
partSize := (len - Rest) div numberParts;
numberParts := numberParts - 1;
for i := 0 to numberParts do
begin
// Get access violation here
CopyMemory(@a[i][1], @filestring[i * partSize], partSize);
end;
if Rest <> 0 then
CopyMemory(@a[numberParts][numberParts*partSize], @filestring[numberParts*partSize], Rest);
end;
我在这条线上遇到访问冲突:
CopyMemory(@a[i][1], @filestring[i * partSize], partSize);
我不确定错误的确切位置。
我如何获得 a[i] 的地址,不是 @a[i][1] 吗?并在第一个循环中尝试访问 @filestring[i* partSize] 时无论如何都会导致错误,因为它将是 0?
希望有人能给我解释一下。
谢谢
我看到三个主要问题:
- 过度纠结的零件计数导致阵列长度确定错误。
- 您必须加 1 才能正确处理 ansistring 字符:
必须设置目标字符串的长度
for i := 0 to numberParts {probably - 1} do
begin
SetLength(a[i], partSize);
CopyMemory(@a[i][1], @filestring[i * partSize + 1], partSize);
end;
最后一块处理也是如此
您的代码对于您的尝试过于复杂。试试这个更简单的代码:
// assuming StringArray is "array of (Ansi)String"...
procedure SplitFile(var a: StringArray; len: integer; fileString: AnsiString; numberParts: integer);
var
i, partSize: integer;
begin
partSize := len div numberParts;
SetLength(a, numberParts);
for i := 0 to numberParts-1 do begin
a[i] := Copy(filestring, (i * partSize)+1, partSize);
end;
end;
在最后一次迭代中,如果请求的计数超过请求偏移处的可用字符数,Copy()
将为您截断返回的子字符串。
我想在 X 部分字符串中拆分一个字符串。
到目前为止,这是我的代码:
procedure SplitFile(var a: StringArray; len: integer; fileString: AnsiString; numberParts: integer);
var
i, Rest, partSize: integer;
tmp: AnsiString;
begin
Rest := len mod numberParts;
SetLength(a, numberParts);
partSize := (len - Rest) div numberParts;
numberParts := numberParts - 1;
for i := 0 to numberParts do
begin
// Get access violation here
CopyMemory(@a[i][1], @filestring[i * partSize], partSize);
end;
if Rest <> 0 then
CopyMemory(@a[numberParts][numberParts*partSize], @filestring[numberParts*partSize], Rest);
end;
我在这条线上遇到访问冲突:
CopyMemory(@a[i][1], @filestring[i * partSize], partSize);
我不确定错误的确切位置。 我如何获得 a[i] 的地址,不是 @a[i][1] 吗?并在第一个循环中尝试访问 @filestring[i* partSize] 时无论如何都会导致错误,因为它将是 0?
希望有人能给我解释一下。
谢谢
我看到三个主要问题:
- 过度纠结的零件计数导致阵列长度确定错误。
- 您必须加 1 才能正确处理 ansistring 字符:
必须设置目标字符串的长度
for i := 0 to numberParts {probably - 1} do begin SetLength(a[i], partSize); CopyMemory(@a[i][1], @filestring[i * partSize + 1], partSize); end;
最后一块处理也是如此
您的代码对于您的尝试过于复杂。试试这个更简单的代码:
// assuming StringArray is "array of (Ansi)String"...
procedure SplitFile(var a: StringArray; len: integer; fileString: AnsiString; numberParts: integer);
var
i, partSize: integer;
begin
partSize := len div numberParts;
SetLength(a, numberParts);
for i := 0 to numberParts-1 do begin
a[i] := Copy(filestring, (i * partSize)+1, partSize);
end;
end;
在最后一次迭代中,如果请求的计数超过请求偏移处的可用字符数,Copy()
将为您截断返回的子字符串。