Java字符串移位加密出现异常字符问题该如何修复
加密代码问题修复方案
问题根因
原有代码的移位逻辑存在3个核心错误:
- 边界判断遗漏:原判断
(ch[i]+x) < 122没有覆盖加完偏移后刚好等于z(ASCII 122)的场景,导致t加7得到123直接溢出小写字母范围输出{ - 溢出后计算逻辑错误:处理超出
z的字符时,先将字符赋值为a再计算偏移量,使用修改后的字符值计算导致结果完全偏离预期 - 未做大小写兼容:未区分大小写字母的ASCII范围,输入大写字母或者移位后不小心落到大写字母范围时就会输出错误字符,你遇到的输入u得到N的问题就是该逻辑错误导致的
修复方案
替换原有复杂的分支判断逻辑,使用模26的标准凯撒移位实现:
- 先判断字符是否是小写字母,是则按小写规则移位
- 若为大写字母按大写规则移位
- 非字母的空格已经提前替换为
*,无需额外处理
修复后完整代码
import java.util.Scanner; public class pppp { public static void main(String[] args) { Scanner input = new Scanner(System.in); String s1 = input.nextLine(); int x = input.nextInt(); char[] ch = new char[s1.length()]; // 反转明文 for (int i = s1.length() - 1, j = 0; i >= 0; i--, j++) { ch[j] = s1.charAt(i); } System.out.println(ch); // 空格替换+移位 for (int i = 0; i < ch.length; i++) { if (ch[i] == ' ') { ch[i] = '*'; } else if (Character.isLowerCase(ch[i])) { // 小写字母移位逻辑 int offset = (ch[i] - 'a' + x) % 26; ch[i] = (char) ('a' + offset); } else if (Character.isUpperCase(ch[i])) { // 大写字母移位逻辑 int offset = (ch[i] - 'A' + x) % 26; ch[i] = (char) ('A' + offset); } } System.out.println(ch); input.close(); } }
验证结果
输入明文megadeth、密钥7时:
- 反转后结果为
htedagem - 移位后结果为
oalkhnlt,原来的{问题修复 - 输入小写字符u、密钥7时,计算逻辑为
(20 +7) %26 =1,对应输出小写b,不会输出错误的N
内容的提问来源于stack exchange,提问作者Muhtasimul Hasan
相关产品推荐
相关产品推荐

