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

凯撒密码解密异常求助:仅解密最后/倒数第二个字符

凯撒密码解密问题修复方案

我瞅了下你的代码,解密功能出问题的根源其实就在msgDecripter函数里,还有几个小细节也得调整下,不用全重写代码,改几处就行:


1. 解密函数的核心bug

你的msgDecripter里有两个关键错误,直接导致了只能显示最后一个字符的问题:

  • 未初始化解密字符串的长度:string decriptedMsg;一开始是空字符串,直接用decriptedMsg[i]赋值会触发内存越界,行为完全不可控。
  • 最后分支的赋值逻辑错误:decriptedMsg = msg[i] - displacement;这行代码是把整个字符串替换成当前单个字符的解密结果,循环到最后自然就只剩最后一个字符的解密值了。

修复后的msgDecripter函数:

void Cipherer::msgDecripter(string msg) {
    string decriptedMsg(msg.size(), ' '); // 提前初始化和输入等长的字符串
    for (unsigned int i = 0; i < msg.size(); i++) {
        if (msg[i] == ' ') { // 用字符常量代替ASCII码,可读性更高
            decriptedMsg[i] = ' '; // 保留空格,避免空格位置出现乱码
            continue;
        } else {
            if ((msg[i] - displacement) < 'a' && (msg[i] - displacement) > 'Z') {
                decriptedMsg[i] = (msg[i] - displacement) + 26;
            } else if ((msg[i] - displacement) < 'A') {
                decriptedMsg[i] = (msg[i] - displacement) + 26;
            } else {
                decriptedMsg[i] = msg[i] - displacement; // 给对应位置赋值,而非覆盖整个字符串
            }
        }
    }
    message = decriptedMsg;
}

2. 文件写入的致命错误

在main函数里,你加密后居然把原明文消息写入了文件,而不是加密后的内容:

// 原来的错误代码
outputFile << msg;
// 必须改成
outputFile << message.getMessage();

否则你从文件读出来的是明文,解密操作完全失去意义。

3. 文件读取的小问题

用inputFile >> encryptedMessage;会因为空格截断字符串,导致读取不完整,应该用getline读取整个文件内容:

string encryptedMessage;
inputFile.open("SecretMSG.txt");
getline(inputFile, encryptedMessage); // 读取整行内容,包含空格
inputFile.close();

修复完这几处之后,解密功能就能正常工作了,完全不用大量重写代码。

内容的提问来源于stack exchange,提问作者Subs103017

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:51:35