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
相关产品推荐
相关产品推荐

