Java凯撒密码加密时保留空格的实现问题求助
解决凯撒密码加密时丢失空格的问题
你的代码里有两个核心问题导致空格丢失:
- 直接跳过了空格字符:原代码中
if (message.charAt(i) == ' ') continue;这行会让程序遇到空格就跳过,不把空格加入加密结果。 - 加密位置计算错误:你的
Alphabet包含空格(总长度27),但计算encryptPos时用了%26,这会导致空格的索引处理出错。
修改后的核心代码部分
把CaesarCipher类里的cipher方法改成这样:
String cipher(String message, int shift) { StringBuilder encryptedMessage = new StringBuilder(); // 用StringBuilder提升拼接效率 for (int i = 0; i < message.length(); i++) { char currentChar = message.charAt(i); int charPos = Alphabet.indexOf(currentChar); // 若字符不在定义的字母表中,直接保留原字符(可选逻辑,按需调整) if (charPos == -1) { encryptedMessage.append(currentChar); continue; } int encryptPos = (shift + charPos) % Alphabet.length(); // 处理负数偏移的解密场景 if (encryptPos < 0) { encryptPos += Alphabet.length(); } char replaceChar = Alphabet.charAt(encryptPos); encryptedMessage.append(replaceChar); } return encryptedMessage.toString(); }
关键修改说明
- 移除了跳过空格的代码,让空格能正常参与处理(因为
Alphabet第一个字符就是空格,偏移0时会完整保留原空格) - 将
%26改为% Alphabet.length(),适配包含空格的字母表总长度 - 用
StringBuilder代替字符串拼接,避免频繁创建字符串对象带来的性能损耗 - 新增了对不在字母表中字符的兼容处理(直接保留原字符)
额外提示
你的主方法目前缺少调用cipher方法的逻辑,记得根据用户选择的选项(加密/解密),创建CaesarCipher实例并调用对应方法,最后输出结果。
内容的提问来源于stack exchange,提问作者Kamen Georgiev
相关产品推荐
相关产品推荐

