发布于2026-07-03 阅读(0)
扫一扫,手机访问
先说几个核心判断:凯撒密码实现中,空格的处理方式往往决定了这个加密函数到底“能用”还是“好用”。很多新手踩坑,问题就出在——它们把空格当作“需要跳过的干扰项”,结果密文里单词连成一串,失去了可读性。更糟糕的是,索引越界直接崩了程序。
在标准凯撒密码实现里,如果输入字符串包含空格(比如 "hello world"),而加密逻辑只对 ALPHABET.indexOf(c) 的返回值做运算,那遇到空格时 indexOf(' ') 会返回 -1。接下来,模运算 (shiftnumber + -1) % 29 就会产生一个非法索引,空格被静默跳过,最终密文就变成 "lippsdasvh",而不是预期的 "lipps asvph"。结构丢失是小事,边界错误才是大问题。
核心解决思路其实很简单:把可加密字符和不可加密字符(空格、标点、换行等)分开处理。前者走位移映射,后者直接透传。下面这段修正后的 encyption 方法,已经适配了 Ja va 语言规范,同时也增强了健壮性:
public static String encyption(int shiftnumber, int EncrDecrpt, String plainText, String ALPHABET) {
StringBuilder encryptStr = new StringBuilder(); // ✅ 用 StringBuilder 替换字符串拼接,避免 O(n²) 性能损耗
for (int i = 0; i < plainText.length(); i++) {
char c = plainText.charAt(i);
// ✅ 明确处理空格:原样保留,不参与位移
if (c == ' ') {
encryptStr.append(' ');
continue;
}
// ✅ 增强容错:只对 ALPHABET 中存在的字符加密,其他字符(如标点、数字)可透传或忽略
int pos = ALPHABET.indexOf(c);
if (pos == -1) {
encryptStr.append(c); // 透传非字母字符(可选策略)
continue;
}
// ✅ 安全位移计算:确保结果索引在 [0, ALPHABET.length()) 范围内
int encryptPos = (pos + shiftnumber) % ALPHABET.length();
if (encryptPos < 0) {
encryptPos += ALPHABET.length(); // 处理负数位移(如解密场景)
}
char encryptChar = ALPHABET.charAt(encryptPos);
encryptStr.append(encryptChar);
}
String result = encryptStr.toString();
System.out.println(result);
return result;
}
⚠️ 关键注意事项:
✅ 总结:空格不是“需要跳过的干扰项”,而是需要显式声明行为的有效占位符。通过 if (c == ' ') 分支提前捕获并透传,配合 StringBuilder 和动态字母表长度,就能实现语义清晰、性能可靠、易于扩展的凯撒密码实现。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8