我用 Ruby 编写了一个凯撒密码加密程序。当我传入包含小写字符的字符串时,它似乎工作得很好,直到我传入一个包含大写字符的字符串。每当我传入包含大写字符的字符串时,代码都会在
main.rb:7:in block in `caeser_cipher': undefined method `+' for nil (NoMethodError)
行之间引发 NoMethodError。
这是我的代码:
def caeser_cipher(string, key)
alphabet = ('a'..'z').to_a
cipher = ""
string.each_char do |char|
if alphabet.include?(char.downcase)
new_key = (alphabet.index(char) + key) % 26
char = alphabet[new_key]
end
cipher << char
end
cipher
end
puts "Enter whatever you please (of course a string of text) that you want encrypted!!!"
text = gets.chomp
puts "And then the offset value"
num = gets.chomp.to_i
puts caeser_cipher(text, num)
我尝试将
char = alphabet[new_key]
包装在另一个 if 条件中以检查 char == char.upcase
,如果评估结果为 true,则执行此操作 char = alphabet[new_key].upcase
,但也失败了。
问题上线了
new_key = (alphabet.index(char) + key) % 26
如果
char
不是小写字符,则不会在字母表中找到它,因此index
将返回nil
。
您需要查找
char
的小写版本,因此可以将该行更改为
new_key = (alphabet.index(char.downcase) + key) % 26