2015-10-15 50 views
0

我正在處理一個簡單的密碼,將字母表中的每個字母切換到其對應的三個空格處。我首先通過使用一種方法來加密密碼,現在正在解密密碼。不幸的是,除了abc之外,每封信都有效,它會返回一個撇號,一個連字符和一個空格。如何讓循環跳過ASCII中的符號並設法讓它從A循環回Z?如何修復我的方法,使其僅返回字母而不是符號?

public static String caesarDecrypt(String encoded, int shift){ 
    String decrypted = ""; 
    for (int i = 0; i < encoded.length(); i++) { 
     char t = encoded.charAt(i); 
     if ((t >= 'a') && (t <= 'z')) { 
      t -= shift; 
     } 
     if (t > 'z') { 
      t += 26; 
     } else if ((t >= 'A') && (t <= 'Z')) { 
      { 
       t -= shift; 
      } 
      if (t > 'Z') 
       t += 26; 
     } else { 

     } 

     decrypted = decrypted + t; 
    } 
    return decrypted; 

} 
+1

請說明您確保如何確保結果僅由字母組成。 –

+0

'「爲什麼我的方法在將它限制爲字母時會返回符號?」 - 受限制** **字母是什麼? –

+0

@ PM77-1我假設我的if語句確保我的回報只會是字母。當我使用t + = shift和t - = 26時,該方法只返回字符 –

回答

3

的Java char s的基於ASCII/UTF值,做出如下:在此基礎上

a = 97 
A = 65 

(做ASCII表搜索等驗證)這部分代碼:

if ((t >= 'a') && (t <= 'z')) { 
    t -= shift; 
} 

將總是將字符「向下」根據他們的編碼G。注意:

char(a) - 1 = ` 

這不完全是一個撇號,但我可以看到你爲什麼這麼說。

對於這些字符,其餘代碼無法訪問(或者確實沒有任何內容,如果是空的else塊),因此您的密碼不能正確「移位」字母表中的第一組小寫字符。

提示:這不是你的密碼中唯一的邏輯缺陷......你應該更仔細地回顧你如何處理大寫字母。

爲了幫助,你應該打印出日誌中的字符整數值的轉換之前,再經過...

編輯:

的工作密碼適當地考慮了移位運算符。它甚至有可能大於26 ......所以,你if語句小寫字母應該是這個樣子:

if ((t >= 'a') && (t <= 'z')) { 
    t = (t - 'a' + shift)%26 + 'a'; 
} 

和遞減應該負移值...或者傳遞到一個布爾值來處理方法。

+0

這對我來說現在是有意義的,但是當我正在使用密碼/加密工作時,'z'沒有移動到'{',即使我寫了兩種方法基本上是相同的方式? –

+0

我並不完全確定你測試了什麼,但是請注意,在我指出的錯誤塊之後,你有'if(t>'z'){t + = 26;}'這樣在將「z」向上移動一次後,它又被轉移了......可能是一個不可打印的字符,所以也許它沒有被注意到? – Jim

+0

好吧,它沒有被忽視,它給了我我正在尋找的回報。這就是爲什麼我不確定如何解決這個問題,因爲它在我的另一種方法 –

相關問題