0

我想在 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?

我希望有人能给我解释一下。

谢谢

4

2 回答 2

2

您的代码对于您正在尝试的内容过于复杂。试试这个更简单的代码:

// 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()如果请求的计数大于请求偏移处的可用字符数,将为您截断返回的子字符串。

于 2015-07-01T03:34:10.557 回答
1

我看到三个主要问题:

  • 过度缠结的部分计数会导致阵列长度确定错误。
  • 您必须添加 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;

最后一块处理也是如此

于 2015-07-01T03:25:42.467 回答