我的程序似乎无法识别 Lua 中的空格

必须为学校制作一个程序。基本上,您有一个字符串,需要使用代码将其保密。秘密字符串是每个字母+字母表中的秘密代码。因此,BALL将成为EDOO,代码为3。空格在字母表中的位置为零,如果位置+代码大于26,则新字母为string + code - 26。现在每当我执行我的程序并添加空格时,它只是在空格之前“翻译”第一部分。顺便说一下,旁边的注释是荷兰语,不是很重要。

    local code = 3
local string = string.upper("spaghetti carbonara") --string
local alfabet = " ABCDEFGHIJKLMNOPQRSTUVWXYZ" --alfabet
local lengte = 6 --lengte van string

for getal1 = 1, lengte do   -- for want moet herhaald worden/getal
  local letter = string.sub(string, getal1, getal1) -- letter uit de string halen
  local locatie = string.find(alfabet, letter) -- letter vinden in alfabet
  if locatie + code < 26 then
    locatie2 = locatie + code -- nieuwe locatie vinden met code
  elseif locatie + code > 26 then
    locatie2 = locatie + code - 26
  end
  local letter2 = string.sub(alfabet, locatie2, locatie2) -- letter die overeenkomt met locatie
  io.write(letter2)
end
点赞
用户4984564
用户4984564

首先,你不应该像在第2行所做的那样使用变量string。这不是巧合使你的程序崩溃,因为所有字符串都具有一个指向string的元方法,为__index。你应该将该变量重命名为其他名称(textinputstr等)。

除此之外,你的程序对我来说似乎完全正常。将一堆空格添加到输入中会添加一堆“C”到输出中。也许你只是忘记将local lengte = 6更改为local lengte =#string了?因为目前它只会“翻译”字符串中的前6个字符。


关于如何改进此问题的提示:如果将一个表作为第三个参数传递给string.gsub,则可以用单个调用替换整个加密/解密部分:

local code = {}
code["a"] = "b"
code["b"] = "a"

print(string.gsub("abc", ".", code))
-- 输出“bac”
-- 将“a”替换为“b”,如表所示
-- 同样,将“b”替换为“a”
-- “c”不是表中的键,因此被忽略

然后你只需要建立一个将你想要替换的每个字符映射到你想要以其替换的字符的表,这会更容易实现:

local function decrypt_encrypt_dictionaries(alphabet, offset)
   local encrypt, decrypt = {}, {}
   --填充两个表的代码在此处 :D
   return encrypt, decrypt
end

local ROT13_encrypt, ROT13_decrypt = dectypt_encrypt_dictionaries("abcde"--[[...等等]], 13)

local some_text = io.read()
--加密一些文本:
local encrypted = string.gsub(some_string, ".", ROT13_encrypt)
--再次解密:
local original = string.gsub(encrypted, ".", ROT13_decrypt)
--看看它是否相同:
print(original)

正如我在上面提到的,这只是将难度从加密/解密转移到构建两个Lua表,我将让你自己解决。

2021-02-08 13:24:35