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(即使我手动更改了两个字节以生成ASCIIA
)。当然,我们无法保证这种情况会一直持续下去。您不应该尝试访问str[0]
。