2

我的编程任务有问题,我循环遍历一个字符串并对字符的整数值求和。如以下代码所述。现在我将一个字符串传递给这个子例程。例如给出

num := '8888';

预期输出为

32

结果输出是

-12

我在 Linux 环境中使用 fpc pascal 编译器。任何关于为什么会发生这种情况的见解将不胜感激

   procedure subRoutine1(num : string);
   var
     i : byte;
     value : integer;
     sum : integer;
   begin
     sum := 0;
     for i := 0 to length(num) do
     begin
       value := Integer(num[i]) - 48;
       sum := sum + value;
     end;
     writeln(sum);
   end; 
4

1 回答 1

3

错误是循环应该从 1 开始,而不是 0。

for i := 0 to length(num) do...
should be
for i := 1 to length(num) do

Pascal 字符串的第一个字节包含字符串的长度。
换句话说, num[0] 包含值 4(字符串长度为 4 个字符),减去 48 后得到 -44,从而摆脱了您的预期总和值。

所以你的程序迭代以下值

  4  -->  -48   =  -44
 56  -->  -48   =  8
 56  -->  -48   =  8
 56  -->  -48   =  8
 56  -->  -48   =  8
            sum = -12

也如其他答案中所建议的那样,请使用 Ord() 函数而不是强制转换为 Integer,即使用

   value := Ord(num[i]) - 48;
or even better,
  value := Ord(num[i]) - Ord('0');
于 2010-02-01T03:16:47.533 回答