
本文详解如何修改凯撒密码加密逻辑,使程序能识别并原样保留输入字符串中的空格,避免因 indexOf(' ') 返回 -1 导致的错位与截断问题。
本文详解如何修改凯撒密码加密逻辑,使程序能识别并原样保留输入字符串中的空格,避免因 `indexof(' ')` 返回 -1 导致的错位与截断问题。
在标准凯撒密码实现中,若未显式处理空格等非字母字符,程序常会因 String.indexOf(char) 对空格返回 -1 而误将其当作无效字符跳过——这不仅导致输出长度缩短(如 "hello world" 变成 "lippsdasvh"),更破坏了原始文本的可读结构(如单词分隔)。根本原因在于:当前代码直接用 ALPHABET.indexOf(plainText.charAt(i)) 查找字符位置,而空格 ' ' 不在 ALPHABET 字符串中,返回值为 -1;后续 (shiftnumber + (-1)) % 29 会产生非法索引,甚至引发 StringIndexOutOfBoundsException(取决于 ALPHABET 长度和移位值)。
正确的做法是在加密循环中显式判断空格,并将其原样追加到结果字符串中,其余字符则按原有逻辑处理。以下是优化后的 encyption 方法:
public static String encyption(int shiftnumber, int EncrDecrpt, String plainText, String encryptStr,
String ALPHABET) {
for (int i = 0; i <p><strong>关键改进说明:</strong> </p>
- ✅ 空格透传:if (c == ' ') { encryptStr += " "; continue; } 确保空格被原样写入结果,维持单词间距;
- ✅ 边界防护:增加 if (pos == -1) 判断,避免对非字母字符(如标点、数字)触发异常,提升鲁棒性;
- ✅ 动态长度适配:将硬编码的 % 29 改为 % ALPHABET.length(),适配不同语言字母表(如英语26字母、土耳其语29字母等);
- ⚠️ 性能提示:encryptStr += ... 在循环中会产生大量临时字符串对象。生产环境建议改用 StringBuilder 提升效率:
StringBuilder sb = new StringBuilder(); // ... 循环内使用 sb.append(...) return sb.toString();
此外,请确保 ALPHABET 字符串本身不含空格(如 "abcdefghijklmnopqrstuvwxyz"),否则 indexOf(' ') 将返回有效索引,导致空格被错误加密。最终效果:输入 "hello world" 与移位 4,输出 "lipps asvph"(小写)或经 toUpperCase() 处理后为 "LIPPS ASVPH",完全符合预期。










