java - 为什么我的凯撒密码只能以小写字母工作
问题描述
我是 JAVA 编程的新手,我正在尝试创建一个凯撒密码加密/解密程序。不幸的是,我的程序只适用于小写。我看不到我哪里出错了我尝试了几次检查我的代码,但我似乎无法找出问题所在。到目前为止,这是我的代码:
import java.util.Scanner;
public class CaesarCipher {
public static String encrypt(String plainText, int shift) {
if (shift > 26) {
shift = shift % 26;
} else if (shift < 0) {
shift = (shift % 26) + 26;
}
String cipherText = "";
int length = plainText.length();
for (int i = 0; i < length; i++) {
char ch = plainText.charAt(i);
if (Character.isLetter(ch)) {
if (Character.isLowerCase(ch)) {
char c = (char) (ch + shift);
if (c > 'z') {
cipherText += (char) (ch - (26 - shift));
} else {
cipherText += c;
}
} else if (Character.isUpperCase(ch)) {
char c = (char) (ch + shift);
if (c > 'Z') {
cipherText += (char) (ch - (26 - shift));
} else {
cipherText += c;
}
}
} else {
cipherText += ch;
}
}
return cipherText;
}
// Decrypt
public static String decrypt(String plainText, int shift) {
if (shift > 26) {
shift = shift % 26;
} else if (shift < 0) {
shift = (shift % 26) + 26;
}
String cipherText = "";
int length = plainText.length();
for (int i = 0; i < length; i++) {
char ch = plainText.charAt(i);
if (Character.isLetter(ch)) {
if (Character.isLowerCase(ch)) {
char c = (char) (ch - shift);
if (c < 'a') {
cipherText += (char) (ch + (26 - shift));
} else {
cipherText += c;
}
} else if (Character.isUpperCase(ch)) {
char c = (char) (ch + shift);
if (c < 'A') {
cipherText += (char) (ch + (26 - shift));
} else {
cipherText += c;
}
}
} else {
cipherText += ch;
}
}
return cipherText;
}
public static void main(String[] args) {
Scanner input1 = new Scanner(System.in);
Scanner input2 = new Scanner(System.in);
System.out.print("Enter your phrase: ");
String inputPlainText = input1.nextLine();
System.out.print("Enter your shift: ");
int shiftForPlainText = input1.nextInt();
String convertPlainText = encrypt(inputPlainText, shiftForPlainText);
System.out.println(convertPlainText);
System.out.print("Enter ciphertext: ");
String inputCipherText = input2.nextLine();
System.out.print("Enter shift: ");
int shiftForCipherText = input2.nextInt();
String convertCipherText = decrypt(inputCipherText, shiftForCipherText);
System.out.println(convertCipherText);
}
}
解决方案
在decrypt
方法中,对于小写,您可以编写:
char c = (char)(ch-shift);
对于大写,你写:
char c = (char)(ch+shift);
我很确定两条线在ch
and之间应该有相同的运算符shift
。如果您不想犯这样的错误,请尝试重构您的代码,以免出现重复的行。
推荐阅读
- c# - 即使成功采用路径,图像也没有显示 - MVVM WPF
- vue.js - npm install 失败,可能是网络问题?
- azure-functions - Azure function Process.Start() C# as different user got Access denied error
- react-native - 如何在 react-native 中处理多个 set-cookie 值?
- excel - 如果将重复记录插入表中,访问不会引发错误
- django - 在 DRF 和 ReactJS 中实现推送通知
- javascript - 验证表单后的 JQuery Ajax submitHandler()
- javascript - 条纹表格无法正确显示
- discord - 删除用户的旧消息 - Discord.js
- django - Django/Google Sheets API 模型/视图问题