我有两个功能:
function EnCryptSymbolVij(text, key:char; abc:string):char;
var st: string;
positionText: word;
begin
if text=' ' then begin EnCryptSymbolVij:=' '; exit; end;
PositionText:=pos(text,abc);
if positionText=0 then exit;
st:=MoveVij(length(abc)-pos(Key,abc)+1, abc);
EnCryptSymbolVij:=st[positionText];
end;
function EnCryptVij(text, key, abc:string):string;
var i, n, j: longword;
st:string;
begin
setlength(st,length(text));
j:=1;
for i:=1 to length(text) do
begin
st[i]:=EnCryptSymbolVij(text[i], Key[j], abc);
inc(j);
if j>length(key) then j:=1;
end;
EnCryptVij:=st;
End;
在第一个函数中,我添加了空间支持。但是当我使用空格加密文本时,我得到了错误的加密,因为第二个函数将空格视为alphavit的一部分。如何修复此问题并忽略第二个函数中的加密空间?请帮助解决这个问题。
答案 0 :(得分:1)
您只支持字母字符和空格。如果你想做更多,你需要在代码中更聪明一些。空格未加密,并且没有任何内容加密到空间,因此您只需要在解密中添加该测试。如果您以后支持其他非字母字符,您也需要对它们执行相同的操作,但加密和解密的测试相同。因此,对于空格,符号的解密代码将像加密一样启动,如此
function DeCryptSymbolVij(text, key:char; abc:string):char;
var st: string;
positionText: word;
begin
if text=' ' then begin DeCryptSymbolVij:=' '; exit; end;
我个人更喜欢使用'结果'而不是功能名称,但这只是个人偏好。
为了满足第二个功能中的空间,你可以用一个空格测试来包围inc(j),就像这样
function EnCryptVij(text, key, abc:string):string;
var i, n, j: longword;
st:string;
begin
setlength(st,length(text));
j:=1;
for i:=1 to length(text) do
begin
st[i]:=EnCryptSymbolVij(text[i], Key[j], abc);
if st[ I ] <> ' ' then
begin
inc(j);
end;
if j>length(key) then j:=1;
end;
EnCryptVij:=st;
End;
但是为了'未来证明',你可能最好在第一个函数中添加一个Var boolean参数,并在发生替换时设置它:
function EnCryptSymbolVij(text, key:char; abc:string; var changed : boolean):char;
var st: string;
positionText: word;
begin
changed := FALSE;
PositionText:=pos(text,abc);
if positionText=0 then exit;
// else
changed := TRUE;
st:=MoveVij(length(abc)-pos(Key,abc)+1, abc);
EnCryptSymbolVij:=st[positionText];
end;
function EnCryptVij(text, key, abc:string):string;
var i, n, j: longword;
iChanged : Boolean;
st:string;
begin
setlength(st,length(text));
j:=1;
for i:=1 to length(text) do
begin
st[i]:=EnCryptSymbolVij(text[i], Key[j], abc, iChanged);
if iChanged then
begin
inc(j);
end;
if j>length(key) then j:=1;
end;
EnCryptVij:=st;
End;
请注意,第一个函数不需要空间测试(假设'abc'中没有空格)