C++调用STL replace()实现凯撒密码时字符替换不符合预期问题
C++凯撒密码加密程序问题修复
核心错误原因
- 你顺序调用
replace()的逻辑会导致前序替换生成的新字符被后续替换逻辑二次处理:比如第一步把所有a替换为b,下一步执行b换c时,原本的b和刚从a转换来的b会被统一替换为c,经过26次全量替换后,所有字母最终都会被转为a/A,就是你观察到的所有字符变成同一个字母的问题。 - 硬编码switch分支仅支持固定偏移量,代码冗余极高,无法适配用户输入的任意偏移值。
修复实现
直接遍历字符串的每个字符做偏移计算,避免全量替换的二次处理问题,同时天然支持任意自定义偏移量:
#include <iostream> #include <string> #include <cctype> using namespace std; int main() { int Offset; string Message; cout << "请输入加密偏移量:" << endl; cin >> Offset; // 归一化偏移量到0~25区间,支持负数偏移和超过26的偏移值 Offset %= 26; if (Offset < 0) Offset += 26; cout << "请输入需要加密的文本:" << endl; cin >> Message; for (char& ch : Message) { if (islower(ch)) { ch = 'a' + (ch - 'a' + Offset) % 26; } else if (isupper(ch)) { ch = 'A' + (ch - 'A' + Offset) % 26; } // 非字母字符默认保持不变,可按需调整逻辑 } cout << "加密结果:" << Message << endl; return 0; }
内容的提问来源于stack exchange,提问作者HiddenSquid123
相关产品推荐
相关产品推荐

