凯撒密码 - 我哪里出错了?

Caesar's cipher - where am I going wrong?

我已经编写了这个简单的程序,其中包括一种用于对消息进行编码的方法(凯撒密码)...虽然不起作用,但我认为这与我的 if 条件有关'Z'(因此重置为字母表的开头)。

我在网上找到了凯撒密码的其他代码,其中使用了 StringBuilders 和其他我尚未学习的方法。这太棒了,我期待有一天能到达那里,但与此同时,我的代码出了什么问题?

不需要给我答案,但如果能提供提示,我将不胜感激。 :)

 import java.util.*;
 class Exercice4 {

public static void main(String[] args) {

     Scanner sc = new Scanner(System.in);

     System.out.println("Enter a message:");
     String msg = (sc.nextLine()).toUpperCase();

     System.out.println("Enter a value for K:");
     int k = sc.nextInt();

     caesar(msg, k);


}

 public static void caesar(String A, int B) {

     char str[]=A.toCharArray();
     String alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
     for (int i=0; i<A.length(); i++) {
         for (int j=0; j<26; j++) {
             if (alpha.charAt(j) == str[i]) {
                 if ((j+B)>25) {
                     str[i] = alpha.charAt(j + B - 26);
                 } else {
                     str[i] = alpha.charAt(j + B);
                 }
             }
         }  
     }
     String code = new String (str);
     System.out.println("Here is your encoded message: ");
     System.out.println(A);
     System.out.println(code);
 }
} 

当您查找(第二个 for 循环)字母并找到它时,您必须退出 bucle 以避免重复替换。

例如,如果输入字符串是 "A" 并且 k = 2:

您在 alpha 中寻找字母 A 并将其更改为字母 C。随着 bucle 继续迭代 alpha,您找到 C 并将其更改为 E. 等等

打个断点,一步步执行。

虽然您的实施 可以 提供正确的偏移量,但您可以尝试一些更简单的方法。

您只需要知道一个字符可以解释为一个整数,中间没有任何黑魔法。

char x = 'A'; 
System.out.println((int) x); //65

利用这一优势,我们可以像这样实现 caesar:

public static String caesar(String A, int B) {
    char[] newString = A.toCharArray();
    for(int i = 0; i < A.length(); i++){
        int newChar = newString[i]+B;
        while(newChar > 65+26) // 65 = A, 26 = number of letters in the alphabet
            newChar -= 26;

        newString[i] = (char) (newChar);

    }
    return new String(newString);
}