Function 我的函数在Delphi中不返回任何内容

Function 我的函数在Delphi中不返回任何内容,function,delphi,Function,Delphi,这是我的密码: function encrypt(str: string): string; var j: integer; answer: string; begin answer := ''; for j := 0 to system.Length(str) do begin if str[j] = ' ' then begin answer := answer + 'er ';

这是我的密码:

function encrypt(str: string): string;
  var
    j: integer;
    answer: string;
  begin
    answer := '';
    for j := 0 to system.Length(str) do
      begin
        if str[j] = ' ' then
          begin
            answer := answer + 'er ';
          end
        else
          begin
            answer := answer + str[j];
          end;
      end;
    answer := answer + 'er';
    result := answer;
  end;

procedure TForm1.btn_encryptClick(Sender: TObject);
  begin
    lbl_answer.Caption := encrypt(edt_main.Text);
  end;
我没有收到任何错误,但是lbl_的答案没有改变。
谢谢您的帮助。

问题是这行:

for j := 0 to system.Length(str) do
应该是

for j := 1 to system.Length(str) do
在长度为N的字符串中,字符索引为1,2,…,N

这是因为Delphi中的字符串使用基于1的索引。在大多数其他语言中,索引应该是0、1、2、…、N− 一,

但是,您也弄错了字符数:实际上,您尝试在长度为N的字符串中枚举N+1个字符(0,1,2,…N)(例如,考虑N=3的情况。0,1,2,3是四个索引,而不是三个索引!)



为什么从函数中得到一个看似空的字符串?嗯,那是因为。在第一个字符(每个字符有两个字节)之前,长度为四字节(32位)整数
str[0]
很可能会访问第一个字符之前的“字符”。这两个字节是长度的MSB。由于字符串的长度可能不大于$FFFF,因此这些长度为零,因此将获得空字符。这可能会使该字符串的呈现在该点终止,使其看起来像是空的。

我建议您在
项目选项-Delphi编译器-编译-运行时错误中激活
溢出检查
范围检查
,是否尝试在调试器中观察函数的执行情况?“这是因为Delphi中的字符串使用基于1的索引”-除非您在10.4之前的Delphi版本中编译iOS/Android,否则,除非您使用显式关闭它。“
str[0]
很可能会访问第一个字符之前的“字符”-访问基于1的字符串上的索引0通常会被RTL静默地重新映射到索引1。@RemyLebeau:这就是我说“可能”的原因。这里似乎是这样。我甚至在我的系统上尝试了它,它确实给了我两个相同长度的MSB(即使我手动更改了两个字节以生成ASCII
A
)。当然,我们无法保证这种情况会一直持续下去。您不应该尝试访问
str[0]