凯撒密码解密异常求助:仅解密最后/倒数第二个字符
凯撒密码解密问题修复方案
我瞅了下你的代码,解密功能出问题的根源其实就在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
相关产品推荐
相关产品推荐

