Delphi中的结果值逻辑?

时间:2013-06-19 08:39:10

标签: delphi function

我正在编写这个函数,其中如果一个字符串只有一个字符区别,则返回不同的字符位置,如果它们是正确的,那么它应该返回-1和-10他们的差异超过1个字符。

仅举例和示例,'010''110''100''110'效果很好,每个都返回0和1 ......

但是,当我尝试使用'100''101'或使用'110''111' 时,我会得到-1的结果,当它应该是2 !我已经完成了桌面测试,我不能只看到错误。

function combine (m1, m2 : string) : integer;
var
dash : integer;
distinct : integer;
i : integer;

begin
distinct := 0;
dash := -1;

for i := 0 to Length(m1)-1 do
begin
    if m1[i] <> m2[i] then
    begin
      distinct := distinct+1;
      dash := i;
      if distinct > 1 then
        begin
          result:= -10;
          exit;
        end;
    end;
end;
result := dash;
end;

我总是得到相同长度的字符串, 我做错了什么?

1 个答案:

答案 0 :(得分:4)

主要问题是Delphi字符串是基于1的。您的循环需要从1运行到Length(m1)

如果在编译器选项中启用了范围检查,那么编译器会在运行时引发错误,这会导致错误。我不能强调你应该启用范围检查。这将导致编译器在代码中发现错误。

另请注意,这意味着返回的值也将从1开始。因此,'100', '101'的输入将给出结果3,因为这是第一个差异的索引。

您还应该检查m1m2的长度是否相同。如果没有提出异常。

另一个提示。将变量递增1的惯用方法如下:

inc(distinct);

如果要增加不同的值,请写:

inc(distinct, n);

所以,我会写这样的函数:

function combine(const m1, m2: string): integer;
var
  i: integer;
  dash: integer;
  distinct: integer;
begin
  if Length(m1)<>Length(m2) then begin
    raise EAssertionFailed.Create('m1 and m2 must be the same length');
  end;

  distinct := 0;
  dash := -1;

  for i := 1 to Length(m1) do
  begin
    if m1[i] <> m2[i] then
    begin
      inc(distinct);
      dash := i;
      if distinct > 1 then
      begin
        result := -10;
        exit;
      end;
    end;
  end;
  result := dash;
end;