Ruby凯撒密码程序处理含大写字母的字符串时触发NoMethodError问题求助
Ruby凯撒密码程序处理含大写字母的字符串时触发NoMethodError问题求助
嘿,我来帮你捋捋这个问题!你遇到的NoMethodError根源其实很清晰:当处理大写字母时,alphabet.index(char)会返回nil——毕竟你的alphabet数组只有小写的a到z,根本找不到大写字符的索引,nil自然没法和key做加法运算,直接就报错了。
你之前想判断字符是否大写再转大写的思路是对的,但问题出在获取索引的步骤上:你还是用原大写字符去小写数组里找索引,这一步已经返回nil触发报错了,后面的判断根本没机会执行。
给你改好的代码,直接就能解决问题:
def caeser_cipher(string, key) alphabet = ('a'..'z').to_a cipher = "" string.each_char do |char| if alphabet.include?(char.downcase) # 先把字符转小写,确保能在alphabet里找到有效索引 original_index = alphabet.index(char.downcase) new_key = (original_index + key) % 26 new_char = alphabet[new_key] # 根据原字符的大小写,决定加密后字符的大小写 char = char == char.upcase ? new_char.upcase : new_char 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.downcase去获取索引,不管原字符是大写还是小写,都能在小写字母数组里找到对应的位置,不会返回nil - 加密完成后,根据原字符的大小写状态决定是否转大写,这样能保留原字符串的格式(比如原字符串是"HelloWorld",加密后依然是首字母大写的混合格式)
这样运行的话,不管输入的字符串里有大写、小写还是混合字符,都能正常加密啦!
备注:内容来源于stack exchange,提问作者ansatsuken
相关产品推荐
相关产品推荐

