1
procedure TfmCypher.btn1Click(Sender: TObject);
var
  i: integer;
 MasterkeyArray: array of char;
 Masterkey : string;
 j : integer;
begin
Masterkey := edtKey.text;
setlength(MasterKeyArray, length(edtkey.text));

for i:= 0 to length(masterkey) do
begin
 MasterkeyArray[i] := masterkey[i];
end;

在上面的代码中,我试图弄清楚为什么 MasterKeyArray 填充为 { #0, a, b} MasterKeyArray 总是 #0。最终,我只想要一个字符串主密钥的 charArray。我一直遇到将 masterkey[0] 分配为 #0 的问题。Masterkey 字符串是从 editbox.text 中收集的。

4

1 回答 1

4

字符串是 1 索引的,但数组是 0 索引的。您的循环正在尝试访问无效的字符串索引 0,并且您也超出了数组的上限。

试试这个:

procedure TfmCypher.btn1Click(Sender: TObject);
var
  i: integer;
  MasterkeyArray: array of Char;
  Masterkey : string;
begin
  Masterkey := edtKey.text;
  SetLength(MasterKeyArray, Length(Masterkey));

  for I := 1 to Length(MasterKey) do
  begin
    MasterkeyArray[I-1] := Masterkey[I];
  end;
end;

一个更简单的解决方案是完全摆脱循环并使用Move()

procedure TfmCypher.btn1Click(Sender: TObject);
var
  i: integer;
  MasterkeyArray: array of Char;
  Masterkey : string;
begin
  Masterkey := edtKey.text;
  SetLength(MasterKeyArray, Length(Masterkey));
  if Masterkey <> '' then begin
    Move(Masterkey[1], MasterKeyArray[0], Length(Masterkey) * SizeOf(Char));
  end;
end;
于 2013-03-17T23:56:42.180 回答