0

我目前正在开展一个项目,在该项目中我将通过将文件作为输入然后向用户请求一个数字来创建一个 Ceaser Cipher。该数字用于将字母向前移动,因此如果输入的数字为2,则a将变为c。字母表是环绕的(所以如果字母是 z 并且输入是 2,那么加密的字母就是 b),并且程序将忽略非字母字符并简单地继续前进。

我有一个我认为应该可行的解决方案,但我认为我遗漏了一些东西,因为输出不是我所期望的,也不应该是它应该是的。我在下面包含了相关的代码部分

public static String encode(String content, int num){
    char[] contentArray = content.toCharArray();
    String encoded = "";
    for(int i = 0; i < contentArray.length; i++){
        char current = contentArray[i];
        if (current >= 'a' && current <='z' || current >= 'A' && current <= 'Z'){
            current = (char) (current + num);
            if (current > 'z' | current > 'Z'){
                current = (char) (current - 26);
            } else if (current < 'a' | current < 'A'){
                current = (char) (current + 26);
            }
            contentArray[i] = current;
            encoded = encoded + encoded.concat(Character.toString(contentArray[i]));
        } else {
            i++;
        }
    }
    return encoded;
}

上面是我的主要功能,它只是在调用此功能之前询问用户必要的输入。在这种情况下,字符串内容由以下字符组成:taco cat 1-349z 2

理论上,如果用户输入 2 作为 num,这应该返回 vceq ecv 1-349b 2。不幸的是,返回以下...

\I\IK\I\IKW\I\IK\I\IKWI\I\IK\I\IKW\I\IK\I\IKWI\\I\IK\I\IKW\I\IK\I\IKWI\ I\IK\I\IKW\I\IK\I\IKWI\b

...这显然是不正确的。我不知道我的代码出了什么问题,所以任何帮助将不胜感激。谢谢!

4

1 回答 1

0

尝试这个

public static String encode(String enc, int offset) {
        offset = offset % 26 + 26;
        StringBuilder encoded = new StringBuilder();
        for (char i : enc.toCharArray()) {
            if (Character.isLetter(i)) {
                if (Character.isUpperCase(i)) {
                    encoded.append((char) ('A' + (i - 'A' + offset) % 26));
                } else {
                    encoded.append((char) ('a' + (i - 'a' + offset) % 26));
                }
            } else {
                encoded.append(i);
            }
        }
        return encoded.toString();
    }

用法

 System.out.println(encode("taco cat 1-349z", 2));
于 2015-02-27T03:10:12.473 回答