2013-08-03 124 views
3

我以爲我已經學會了足夠的python來製作凱撒密碼,所以我開始製作它,並且我碰到了一堵磚牆。Python凱撒密碼使用Ord和Chr

這裏是我的代碼:

phrase = raw_input("Enter text to Cipher: ") 
shift = int(raw_input("Please enter shift: ")) 
result = ("Encrypted text is: ") 

for character in phrase: 
    x = ord(character) 

    x = x + shift 


print chr(x) 

目前如果短語是「喜」和偏移量是1,圍繞字母i,而不是字母h for循環只是循環,所以我的結果是:J-

我想整個單詞周圍循環,並通過任何移位int變量是移動每個字母。

如何循環使用短語變量?

+1

如果這只是輸出一個字符,那是預期的最後一個字符,這是什麼告訴你_when_了'打印「聲明正在發生? –

+0

抱歉,不是100%確定。我試過把打印放在循環中,結果是:i,j分開。所以它看起來像循環工作,但我打印出信息的方式有問題。 – BubbleMonster

+0

你也應該想想'az'應該會發生什麼,例如 –

回答

2

您的代碼,因爲在循環字符的結束打印的'j'ord()值等於'i'。您應該將新字符存儲到列表中,在循環結束後,您應該將它們加入並打印。

new_strs = [] 
for character in phrase: 
    x = ord(character) 
    x = x + shift 
    new_strs.append(chr(x)) #store the new shifted character to the list 
    #use this if you want z to shift to 'a' 
    #new_strs.append(chr(x if 97 <= x <= 122 else 96 + x % 122)) 
print "".join(new_strs)  #print the new string 

演示:

$ python so.py 
Enter text to Cipher: hi 
Please enter shift: 1 
ij 
+0

追加基本上連接移位的字符是嗎? – BubbleMonster

+0

@BubbleMonster是的,'list.append'在列表的末尾添加項目。 –

1

追加每個加密字符到result字符串。

phrase = raw_input("Enter text to Cipher: ") 
shift = int(raw_input("Please enter shift: ")) 
result = "" 

for character in phrase: 
    x = ord(character) 
    result += chr(x + shift) 

print result 
+0

謝謝,作品太 – BubbleMonster

0

嘗試:

phrase = raw_input("Enter text to Cipher: ") 
shift = int(raw_input("Please enter shift: ")) 
result = ("Encrypted text is: ") 
import sys 
for character in phrase: 
    x = ord(character) 
    x = x + shift 
    sys.stdout.write(chr(x)) 
    sys.stdout.flush()