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

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;
}

优化说明

  1. 范围化密钥处理:对不同字符集分别取模(小写/大写模26,可打印ASCII模95),同时通过+26/+95确保模运算结果为非负数,完美兼容正负密钥。
  2. 避免溢出:通过计算字符相对于字符集起始位置的偏移量再进行密钥运算,避免直接对char累加导致的溢出问题。
  3. 迭代方式优化:使用范围for循环遍历字符串,直接修改原字符(引用传递),代码更简洁高效。
  4. 明确边界处理:对非可打印字符直接保留,若题目有特殊要求可快速补充对应逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 21:12:33