简单地在Lazarus中添加字符串时的奇怪行为 - FreePascal

时间:2014-05-25 18:18:15

标签: string delphi freepascal lazarus addition

该程序有几个"加密"算法。这个应该按顺序反转输入。 "他| 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;的内容完全没有它,它不会再添加结果了。 正如你所看到的,我甚至使用了一个临时变量来尝试解决这个问题。虽然没有改变任何东西。

1 个答案:

答案 0 :(得分:0)

我99.99%确定您的问题是由于代码中的细微错误造成的。然而,你故意隐藏相关代码的努力意味着我们真的在黑暗中拍摄。你甚至都不清楚你在哪里看到缩短的Result:GUI控制/调试器/写入

具有讽刺意味的是,您可以轻松获取所有信息,以便对您的问题进行简明扼要的演示 - 包括样本输入和预期输出。

所以没有相关信息,我只能猜测;我确实认为我有一个好的预感。

尝试以下代码,看看您是否对S3有类似的体验:

S1 := 'a'#0;
S2 := 'bc';
S3 := S1 + S2;

我预感的原因是#0是字符串中的有效字符:但只要该字符串需要处理为PChar#0将被解释为字符串终止符。这很可能会导致你所看到的“奇怪行为”。

因此,很可能您的代码中至少有以下两个错误之一:

  1. 你总是处理1个太多字符;额外字符为#0
  2. 当您的输入字符串具有奇数个字符时:您的算法(依赖于字符对)会添加一个值为#0的额外字符。

  3. 修改

    使用其他源代码,我的预感得到确认:

    • 假设您有一个5个字符的字符串,以及产生块长度为2的密钥。
    • 您的内循环(for posB := 1 to bl do)将在外循环的最后一次迭代中读取超出inStr的长度。
    • 因此,如果内存中的下一个字符恰好是#0,那么您将完全按照上述说明进行操作。

    其他问题。您有以下代码:

     //calculating block length 2..6
     bl := calcBl(keyStr);
    

    您在评论中的假设是错误的。从calcBl的实施开始,如果keyStr为空,则结果为0。