我正在开展一个项目,我将通过将文件作为输入然后从用户请求号码来创建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 \我\ IKWI \ I \ IK \ I \ IKW \ I \ IK \ I \ IKWI \ b'/ p>
......这显然不正确。我不知道我的代码出了什么问题,所以非常感谢任何帮助。谢谢!
答案 0 :(得分: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));