特定于代码:加密消息,并使索引越界

2024-10-02 20:40:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个简单的加密程序,它一直在工作,直到几分钟。它适用于简单的单词,比如星期一,但是当我使用较长的短语,比如“今天是星期一”时,我会得到一个索引越界错误。我想知道如何才能避免这种情况,让它加密整个消息。你知道吗

alphabet = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","w","y","z"]

print()
originalMessage = input("Enter a message: ") # user input for message to be encrypted
cipheredMessage = ''
shiftNumber = int(input("Enter a number to shift by (0-25): ")) # user input for value to shift by

# for loop to encrypt message using a ciphered alphabet

for letter in originalMessage:
    letter = letter.lower()
    if letter.isalpha():
        shift = alphabet.index(letter) + shiftNumber
        newPosition = alphabet[shift]
        cipheredMessage += newPosition
    elif ' ' or "!" or "." or "," or ";" or ":" or "-" in letter:
        cipheredMessage += letter
print("Encrypting message....")
print("\tEncrypted message: " + cipheredMessage)

# for loop to decrypt the message into its orginal form

decipheredMessage = ''
for letter in cipheredMessage:
    letter = letter.lower()
    if letter.isalpha(): # checks to make sure the message contains alphabets
        shift = alphabet.index(letter) - shiftNumber
        newPosition = alphabet[shift]
        decipheredMessage += newPosition
    elif ' ' or "!" or "." or "," or ";" or ":" or "-" in letter: # makes sure spaces and punctuation is not affected in the encryption
        decipheredMessage += letter
print("Decrypting message....")
print("\tDecrypted message: " + decipheredMessage)
print("\tOriginal message: " + originalMessage)

Tags: ortoinmessageforinputshiftprint
2条回答

你的信息长度无关紧要。问题在于:

if letter.isalpha():
    shift = alphabet.index(letter) + shiftNumber
    newPosition = alphabet[shift]

如果shiftNumber输入为25,会发生什么情况?你知道吗

问题是,当您将shift_number添加到字母索引时,它可能会增长超过25。你应该应用模。你知道吗

类似地,当减去一个值时,可以变成负数。在这种情况下,它是安全的,因为Python允许负索引。然而,你应该意识到,你正在产生一个负指数。你知道吗

我还修复了代码中的一些其他问题:

alphabet = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
            "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]

if __name__ == '__main__':
    print()
    # you should use snake_case for local variables in Python
    original_message = input("Enter a message: ")  # user input for message to be encrypted
    ciphered_message = ''
    shift_number = int(input("Enter a number to shift by (0-25): ")) # user input for value to shift by

    # for loop to encrypt message using a ciphered alphabet

    for letter in original_message.lower():  # call lower() once for the whole string
        if letter.isalpha():
            shift = alphabet.index(letter) + shift_number
            # Add modulo to keep shift in 0..25 range
            shift = shift % len(alphabet)
            new_letter = alphabet[shift]
            ciphered_message += new_letter
        elif letter in ' !.,;:-':  # the condition was incorrect
            ciphered_message += letter
    print("Encrypting message....")
    print("\tEncrypted message: " + ciphered_message)

    # for loop to decrypt the message into its orginal form

    deciphered_message = ''
    for letter in ciphered_message.lower():
        if letter.isalpha():  # checks to make sure the message contains alphabets
            shift = alphabet.index(letter) - shift_number
            new_letter = alphabet[shift]
            deciphered_message += new_letter
        elif letter in ' !.,;:-':  # makes sure spaces and punctuation is not affected in the encryption
            deciphered_message += letter
    print("Decrypting message....")
    print("\tDecrypted message: " + deciphered_message)
    print("\tOriginal message: " + original_message)

相关问题 更多 >