2016-11-12 49 views
0

我正在做某种密码,需要一个字符串被倒读,我也得到一个索引错误,即使我引用索引以及在范围内:字符串索引不起作用? - Python的

M = str(input("Input Message: ")) 
M = M.upper() 
L = len(M) 
A = ["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"] 

def DECRYPT(): 
    global L 
    global M 
    global A 

    if L%2 != 0: 
     POS = False 
    else: 
     POS = True 

    i = L-1 
    NM = "" 
    while 1: 
     if M[i] != " ": 
      INDEX = A.index(M[i]) 
      if POS == True: 
       INDEX += (i + 1) 
      else: 
       INDEX -= (i) 
      INDEX %= 26   
      NM = NM+A[INDEX] 
      i += 1 
      if POS == True: 
       POS = False 
      else: 
       POS = True 
    print("\n"+NM) 

def ENCRYPT(): 
    global L 
    global A 
    global M 

    POS = True 
    M = M[::-1] 
    i = 0 
    NM = "" 

    while 1: 
     if i == L: 
      break 
     if M[i] != " ": 
      INDEX = A.index(M[i]) 
      if POS == True: 
       INDEX += (i + 1) 
      else: 
       INDEX -= (i + 1) 
      INDEX %= 26   
      NM = NM+A[INDEX] 
     i += 1 
     if POS == True: 
      POS = False 
     else: 
      POS = True 
    print("\n"+NM) 

while 1: 
    C = int(input("\nWhat do you want to do:\n1) Encrypt Something\n2)Decrypt Something\n\n")) 
    if C == 1: 
      ENCRYPT() 
    if C == 2: 
      DECRYPT() 

其中i是一个占位符值。我运行它并得到这个:

Input Message: ABC 

What do you want to do: 
1) Encrypt Something 
2)Decrypt Something 

2 
Traceback (most recent call last): 
    File "C:\Users\Danny\Google Drive\SHIFT.py", line 67, in <module> 
    DECRYPT() 
    File "C:\Users\Danny\Google Drive\SHIFT.py", line 19, in DECRYPT 
    if M[i] != " ": 
IndexError: string index out of range 

我试过改变我的价值无济于事。

+1

'CODE'休息导致错误 – ForceBru

+0

'String'是大概是空的 –

+2

错误发生在你没有显示的代码部分。 – idjaw

回答

1

您的代码有多个问题:正如fernand0指出的,您的索引运行方式错误;您的代码反转POS发生在不同的层次上,加密者在每个字符上都会这样做,解密者在每个字母上都会这样做 - 它们应该是一样的;您的六个全球声明中有五个是不需要的;你不正确地处理分词,因此解密将不能匹配原始分词;一旦您加密,在同一会话中无法解密,因为本地NM未反馈到全球M

以下是我对代码的返工,解决了上述问题和一些样式问题。这里的关键词是'简化'。我已经把你的奇怪的大写变量名,但扩大了他们从单个字符到它们所代表:

MESSAGE = input("Input Message: ").upper() 
ALPHABET = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ") 
ALPHABET_LENGTH = len(ALPHABET) 

def DECRYPT(MESSAGE): 

    LENGTH = len(MESSAGE) 
    IS_NEGATIVE = True 

    NEW_MESSAGE = "" 

    for I in range(LENGTH): 

     if MESSAGE[I] in ALPHABET: 
      INDEX = ALPHABET.index(MESSAGE[I]) 
      if IS_NEGATIVE: 
       INDEX -= (I + 1) 
      else: 
       INDEX += (I + 1) 
      INDEX %= ALPHABET_LENGTH 
      NEW_MESSAGE += ALPHABET[INDEX] 

      IS_NEGATIVE = not IS_NEGATIVE 
     else: 
      NEW_MESSAGE += MESSAGE[I] 

    return NEW_MESSAGE[::-1] 

def ENCRYPT(MESSAGE): 

    MESSAGE = MESSAGE[::-1] 

    LENGTH = len(MESSAGE) 
    IS_POSITIVE = True 

    NEW_MESSAGE = "" 

    for I in range(LENGTH): 

     if MESSAGE[I] in ALPHABET: 
      INDEX = ALPHABET.index(MESSAGE[I]) 
      if IS_POSITIVE: 
       INDEX += (I + 1) 
      else: 
       INDEX -= (I + 1) 
      INDEX %= ALPHABET_LENGTH 
      NEW_MESSAGE += ALPHABET[INDEX] 

      IS_POSITIVE = not IS_POSITIVE 
     else: 
      NEW_MESSAGE += MESSAGE[I] 

    return NEW_MESSAGE 

while True: 
    print("\nWhat do you want to do:") 
    print("1) Encrypt Message") 
    print("2) Decrypt Message") 

    CHOICE = int(input("\n")) 

    if CHOICE == 1: 
     MESSAGE = ENCRYPT(MESSAGE) 
    if CHOICE == 2: 
     MESSAGE = DECRYPT(MESSAGE) 

    print("\n" + MESSAGE) 

TEST

> python3 file.py 
Input Message: An opportunity to teach is an opportunity to learn 

What do you want to do: 
1) Encrypt Message 
2) Decrypt Message 

1 

OPDAQ HB OEWAGIBFXIU JD RI JZEZZ GC NFVBFJAGWJT KC 

What do you want to do: 
1) Encrypt Message 
2) Decrypt Message 

2 

AN OPPORTUNITY TO TEACH IS AN OPPORTUNITY TO LEARN 

What do you want to do: 
1) Encrypt Message 
2) Decrypt Message 
0

你开始我在字符串的末尾,然后,你正在增加它。我认为行i + = 1应该是我 - = 1

+0

我已经更正了语法,但它对错误 – WhoGivesAFlux

+0

没有影响好吧,还有更多问题。只有当你输入if时,你才会减少我,所以这是一个问题。而且,这个时候的条件是1,所以我会变成最终-1,这是超出范围的。尝试将打印(“我”,我,L-1) 下的while 1,你会看到发生了什么。 – fernand0