【问题标题】:String to Char Array using a for loop string[0] is always null使用 for 循环字符串到字符数组的字符串 [0] 始终为空
【发布时间】:2013-03-17 22:27:24
【问题描述】:
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 中收集的。

【问题讨论】:

    标签: delphi delphi-2010


    【解决方案1】:

    字符串是 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;
    

    【讨论】:

    • 太棒了,谢谢!你能告诉我更多关于字符串为什么会这样吗?
    • @user1868232:向后兼容。 Pascal 字符串(ShortStringString[255])将它们的长度存储在字节 0 中,将字符串的第一个字符存储在字节 1 中。当在 Delphi 2 中引入长字符串时,它们仍然从 1 开始以兼容旧代码和从那以后一直保持这种状态。
    • 直到 XE3,即添加了 {$ZEROBASEDSTRINGS} 指令以可选地启用基于 0 的字符串索引。默认关闭,但未来可能会在新的移动环境准备就绪时开启。
    猜你喜欢
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多