You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java凯撒密码加密时保留空格的实现问题求助

解决凯撒密码加密时丢失空格的问题

你的代码里有两个核心问题导致空格丢失:

  1. 直接跳过了空格字符:原代码中if (message.charAt(i) == ' ') continue;这行会让程序遇到空格就跳过,不把空格加入加密结果。
  2. 加密位置计算错误:你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 10:01:24