Caesar Cypher程序:字符串索引超出范围错误

时间:2016-02-27 18:24:36

标签: python encryption caesar-cipher

是因为彼此内部有两个if和else语句吗?

我正在为课堂制作一个Caesar Cipher程序。我收到一个错误:

Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    main()
  File "C:\Users\Chandler\Desktop\CSCI220-S16-Assign2-CaesarEncode-CTL.py", line 31, in main
    print("You coded message is: ", (code(message)))
  File "C:\Users\Chandler\Desktop\CSCI220-S16-Assign2-CaesarEncode-CTL.py", line 25, in code
    textInput += alphabet[letterPos]
IndexError: string index out of range

只是旁注我还将创建此程序的另一个循环部分,以将文本解包回初始输入

def main():

    alphabet = "abcdefghijklmnopqrstuvwxyz"

    message = input("Enter the message you wish to be encoded: ")
    message = message.lower()

    key = eval(input("Enter the key shift: "))

    def code(message):
        textInput = ""
        for ch in message:
            if ch in alphabet:          
                letterPos = alphabet.find(ch) + key
                if letterPos > 26:
                    letterPos % key
                else:

                    letterPos + key
                textInput += alphabet[letterPos]

            else:
                cyphertext += ch
        return textInput

    print("You coded message is: ", (code(message)))



#end main
main()

2 个答案:

答案 0 :(得分:0)

插入print语句,以便在程序进行时查看letterPos的值。找出26岁或更大的时间。 26或更大版本需要if语句:if letterPos&gt; = 26.

答案 1 :(得分:0)

您已使用letterPos = alphabet.find(ch) + key移动该字母,并在必要时在if letterPos > 26块中将其换行。但是,您必须使用模26,而不是key值。另外,else块既是多余的也是冒犯的,因为你第二次移动字母而没有环绕。

由于分支较慢,因此每次都应使用模数。总而言之,这应该解决问题。

if ch in alphabet:
    letterPos = (alphabet.find(ch) + key) % 26
    textInput += alphabet[letterPos]
else:
    textInput += ch

另外,请注意名称cyphertext,它不会在任何地方定义。