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

C++替换密码程序解码函数无法正常运行问题求助

替换密码解码功能实现方案

核心逻辑说明

加密逻辑是明文字母(A-Z)对应索引 = 明文字母 - 'A',取出cipher[索引]得到密文字母。
解码需要反向映射:找到密文字母在cipher数组中的索引,明文就是'A' + 该索引。

推荐实现方式(预生成反向映射表,效率最高)

步骤1:生成反向密码表

在main函数中定义完cipher数组后,新增代码生成解码用的decipher数组:

const int ARRAY_SIZE = 26;
const char cipher[ARRAY_SIZE] = {'B', 'T', 'N', 'M', 'X', 'W', 'E', 'V', 'L', 'K', 'P', 'Q', 'C', 'R', 'J', 'Y', 'Z', 'D', 'A', 'F', 'H', 'I', 'G', 'S', 'U', 'O'};
// 新增解码反向表
char decipher[ARRAY_SIZE];
for (int i = 0; i < ARRAY_SIZE; ++i) {
    // cipher[i]是索引i对应明文的密文,反向表中密文对应位置存明文
    decipher[cipher[i] - 'A'] = 'A' + i;
}

步骤2:修改decodeText函数

同时修复原代码的数组越界bug(原循环用i <= 字符串长度会访问到字符串结束符位置,属于未定义行为,改为i < 字符串长度):

string decodeText(string encodedText, const char decipher[])
{
    for (int i = 0; i < encodedText.length(); ++i)
    {
        char upper_c = toupper(encodedText[i]);
        if ((upper_c >= 'A') && (upper_c <= 'Z')) {
            encodedText[i] = decipher[upper_c - 'A'];
        }
    }
    return encodedText;
}

步骤3:修改main函数中decodeText的调用参数

将原来传入cipher改为传入生成的decipher:

string decoded = decodeText(encodedText, decipher);

可选实现方式(无需预生成表,适合短文本)

如果不想额外存储反向表,可以直接在decodeText中遍历cipher数组找对应索引,性能略低但逻辑简单:

string decodeText(string encodedText, const char cipher[])
{
    const int ARRAY_SIZE = 26;
    for (int i = 0; i < encodedText.length(); ++i)
    {
        char upper_c = toupper(encodedText[i]);
        if ((upper_c >= 'A') && (upper_c <= 'Z')) {
            // 遍历找到密文在cipher中的索引
            for (int j = 0; j < ARRAY_SIZE; ++j) {
                if (cipher[j] == upper_c) {
                    encodedText[i] = 'A' + j;
                    break;
                }
            }
        }
    }
    return encodedText;
}

额外bug修复

原encodeText函数也存在同样的数组越界问题,将循环条件从i <= plaintext.length()改为i < plaintext.length()即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:24:03