在delphi中替换的函数

时间:2013-09-29 18:38:57

标签: delphi

我正在制作一个替换别人的字母的功能,问题是它不能按我的意愿工作。

来源

function encode(texto:string): string;

var
  cadena: string;
  i: integer;

const
  letras: array [1 .. 26] of string = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
    'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
    'x', 'y', 'z');
const
  in_letras: array [1 .. 26] of string =
    ('z', 'y', 'x', 'w', 'v', 'u', 't', 's', 'r', 'q', 'p', 'o', 'n', 'm', 'l',
    'k', 'j', 'i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a');

begin


    for i := Low(letras) to High(letras) do
    begin
      texto := StringReplace(texto, letras[i], in_letras[i],[rfReplaceAll]);
    end;


Result := texto;

end;

Edit2.Text := encode(Edit1.Text);

使用函数encode()在Edit1和I Edig1中返回,这不应该发生因为我在替换函数时做错了什么

2 个答案:

答案 0 :(得分:6)

它不起作用,因为你逐渐破坏循环中的输入。每次循环都会对修改后的字符串进行操作,而不是对原始输入字符串进行操作。

基本问题是,处理完角色后,您不能再处理它。您必须只处理一次输入字符。你处理每个角色26次。你的方法永远无法解决。

你会用这样的事情做得更好:

function encode(const input: string): string;
var
  i: Integer;
begin
  Result := input;
  for i := 1 to Length(Result) do 
    if (Result[i]>='a') and (Result[i]<='z') then
      Result[i] := Chr(ord('a') + ord('z') - ord(Result[i]));
end;

您的函数实现以下映射:

a -> z
b -> y
c -> x
....
y -> b
z -> a

b的序数值比a的序数值多1倍。并且c的序数值比b多一个。等等。因此,z的序数值比a多25个。

因此,我们假设a的序数为0,b的序数为1,依此类推。然后我们将0映射到25,1到24,2到23,依此类推。如果是这样,那么我们需要的功能就是:

output = 25 - input

或者你可能会这样写:

output = ord('z') - input

现在,恰好a的序数值不等于0。因此,为了使此功能起作用,我们需要将值移位以允许a的序数值。因此功能变为:

output = ord('a') + ord('z') - input

答案 1 :(得分:3)

最简单的直接解决方案是双循环:

function encode(texto: string): string;
var
  I, J: Integer;
const
  letras: array [1 .. 26] of Char = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
    'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
    'x', 'y', 'z');
const
  in_letras: array [1 .. 26] of Char =
    ('z', 'y', 'x', 'w', 'v', 'u', 't', 's', 'r', 'q', 'p', 'o', 'n', 'm', 'l',
    'k', 'j', 'i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a');
begin
  for J := 1 to length(texto) do
    for I := Low(letras) to High(letras) do
    begin
      if texto[J] = letras[I] then
      begin
        texto[J] := in_letras[I];
        Break;
      end;
    end;
  Result := texto;
end;