Delphi 使用for循环字符串[0]的字符串到字符数组始终为空

Delphi 使用for循环字符串[0]的字符串到字符数组始终为空,delphi,delphi-2010,Delphi,Delphi 2010,在上面的代码中,我试图找出为什么MasterKeyArray填充为{0,a,b} MasterKeyArray始终为0。最终,我只想要一个字符串主密钥的字符。主密钥[0]被分配为0时,我一直遇到问题。Masterkey字符串是从editbox收集的。text。字符串是1索引的,但数组是0索引的。您的循环正在尝试访问无效的字符串索引0,并且您也超出了数组的上限 请尝试以下方法: procedure TfmCypher.btn1Click(Sender: TObject); var i: int

在上面的代码中,我试图找出为什么MasterKeyArray填充为{0,a,b}
MasterKeyArray始终为0。最终,我只想要一个字符串主密钥的字符。主密钥[0]被分配为0时,我一直遇到问题。Masterkey字符串是从editbox收集的。text。

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

请尝试以下方法:

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;
一个更简单的解决方案是完全摆脱循环,改用Move:


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

请尝试以下方法:

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;
一个更简单的解决方案是完全摆脱循环,改用Move:


太棒了,谢谢!你能告诉我为什么字符串会出现这种情况吗?@user1868232:向后兼容性。Pascal字符串ShortString或字符串[255]将其长度存储在字节0中,字符串的第一个字符存储在字节1中。当Delphi 2中引入长字符串时,它们仍然基于1以与旧代码兼容,并且从那时起一直保持这种方式。直到XE3,也就是说,当添加{$ZEROBASEDSTRINGS}指令以可选地启用基于0的字符串索引时。它在默认情况下是关闭的,但在将来新的移动环境准备就绪时可能会打开。太棒了,谢谢!你能告诉我为什么字符串会出现这种情况吗?@user1868232:向后兼容性。Pascal字符串ShortString或字符串[255]将其长度存储在字节0中,字符串的第一个字符存储在字节1中。当Delphi 2中引入长字符串时,它们仍然基于1以与旧代码兼容,并且从那时起一直保持这种方式。直到XE3,也就是说,当添加{$ZEROBASEDSTRINGS}指令以可选地启用基于0的字符串索引时。默认情况下,它处于关闭状态,但将来在新的移动环境就绪时可能会打开。
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;