C++凯撒密码加密代码隐藏测试用例失败,求优化方案
凯撒密码加密函数的健壮性优化
你的代码存在几个关键问题,这些可能正是导致隐藏测试用例失败的原因:
问题分析
- 未处理负密钥:当密钥
n为负数时,字符移位会低于字符集下限(比如'a'减2应得到'y'),但现有代码只判断了移位后超出上限的情况,未处理下限溢出。 - 未处理超大密钥:当
n远大于字符集长度时(比如n=100),直接累加会触发有符号char的溢出(比如126+2=128,超过signed char最大值127变为负数),导致判断逻辑失效。 - 溢出引发逻辑错误:多数编译器中
char为有符号类型,字符累加密钥后超出127会变为负数,此时ch > 126的判断不成立,无法执行循环移位操作。
优化后的代码
#include <iostream> #include <string> using namespace std; string encryptString(string str, int n) { for (char &ch : str) { // 处理小写字母:a-z,共26个字符 if (ch >= 'a' && ch <= 'z') { int offset = ch - 'a'; // 加26确保模运算结果非负,兼容负密钥 offset = (offset + n + 26) % 26; ch = 'a' + offset; } // 处理大写字母:A-Z,共26个字符 else if (ch >= 'A' && ch <= 'Z') { int offset = ch - 'A'; offset = (offset + n + 26) % 26; ch = 'A' + offset; } // 处理可打印ASCII字符(32-126),共95个字符 else if (ch >= 32 && ch <= 126) { int offset = ch - 32; // 加95确保模运算结果非负 offset = (offset + n + 95) % 95; ch = 32 + offset; } // 非可打印字符直接保留(若题目要求处理可补充逻辑) } return str; } int main() { cout << "Enter the message: " << endl; string msg; getline(cin, msg); int key; cout << "Enter key: "; cin >> key; string encryptedMsg = encryptString(msg, key); cout << "Encrypted message: " << encryptedMsg << endl; return 0; }
优化说明
- 范围化密钥处理:对不同字符集分别取模(小写/大写模26,可打印ASCII模95),同时通过
+26/+95确保模运算结果为非负数,完美兼容正负密钥。 - 避免溢出:通过计算字符相对于字符集起始位置的偏移量再进行密钥运算,避免直接对
char累加导致的溢出问题。 - 迭代方式优化:使用范围
for循环遍历字符串,直接修改原字符(引用传递),代码更简洁高效。 - 明确边界处理:对非可打印字符直接保留,若题目有特殊要求可快速补充对应逻辑。
内容的提问来源于stack exchange,提问作者Rahul Sharma
相关产品推荐
相关产品推荐

