该程序有几个"加密"算法。这个应该按顺序反转输入。 "他| ll | o"成为" o | ll |他" (块长度为2)。
我添加两个字符串,在这种情况下,将结果字符串附加到当前"块"字符串并使结果。当我首先添加结果然后块,它工作正常,并给我回原始字符串。但是当我试图扭转顺序时,它只给了我最后一个"块"。
用于"旋转"的其他几个功能。在上面。
//amount of blocks
function amBl(i1:integer;i2:integer):integer;
begin
if (i1 mod i2) <> 0 then result := (i1 div i2) else result := (i1 div i2) - 1;
end;
//calculation of block length
function calcBl(keyStr:string):integer;
var i:integer;
begin
result := 0;
for i := 1 to Length(keyStr) do
begin
result := (result + ord(keyStr[i])) mod 5;
result := result + 2;
end;
end;
//desperate try to add strings
function append(s1,s2:string):string;
begin
insert(s2,s1,Length(s1)+1);
result := s1;
end;
function rotation(inStr,keyStr:string):string;
var //array of chars -> string
block,temp:string;
//position in block variable
posB:integer;
//block length and block count variable
bl, bc:integer;
//null character as placeholder
n : ansiChar;
begin
//calculating block length 2..6
bl := calcBl(keyStr);
setLength(block,bl);
result := '';
temp := '';
{n := #00;}
for bc := 0 to amBl(Length(inStr),bl) do
begin
//filling block with chars starting from back of virtual block (in inStr)
for posB := 1 to bl do
begin
block[posB] := inStr[bc * bl + posB];
{if inStr[bc * bl + posB] = ' ' then block[posB] := n;}
end;
//adding the block in front of the existing result string
temp := result;
result := block + temp;
//result := append(block,temp);
//result := concat(block,temp);
end;
end;
(完整代码http://pastebin.com/6Uarerhk)
在所有循环之后&#34;结果&#34;具有正确的价值,但是在最后一步(在&#34;结果:=块+临时&#34;以及&#34;结束;&#34;函数之间)&#34;块&#34;替换&#34;结果&#34;的内容完全没有它,它不会再添加结果了。 正如你所看到的,我甚至使用了一个临时变量来尝试解决这个问题。虽然没有改变任何东西。
答案 0 :(得分:0)
我99.99%确定您的问题是由于代码中的细微错误造成的。然而,你故意隐藏相关代码的努力意味着我们真的在黑暗中拍摄。你甚至都不清楚你在哪里看到缩短的Result
:GUI控制/调试器/写入
具有讽刺意味的是,您可以轻松获取所有信息,以便对您的问题进行简明扼要的演示 - 包括样本输入和预期输出。
所以没有相关信息,我只能猜测;我确实认为我有一个好的预感。
尝试以下代码,看看您是否对S3
有类似的体验:
S1 := 'a'#0;
S2 := 'bc';
S3 := S1 + S2;
我预感的原因是#0
是字符串中的有效字符:但只要该字符串需要处理为PChar
,#0
将被解释为字符串终止符。这很可能会导致你所看到的“奇怪行为”。
因此,很可能您的代码中至少有以下两个错误之一:
#0
。#0
的额外字符。使用其他源代码,我的预感得到确认:
for posB := 1 to bl do
)将在外循环的最后一次迭代中读取超出inStr
的长度。#0
,那么您将完全按照上述说明进行操作。其他问题。您有以下代码:
//calculating block length 2..6
bl := calcBl(keyStr);
您在评论中的假设是错误的。从calcBl
的实施开始,如果keyStr
为空,则结果为0。