- C++
2020 16
- 2025-9-7 17:46:20 @
// 包含标准库头文件,提供一些通用功能
#include <cstdlib>
// 包含输入输出流头文件,用于输入输出操作
#include <iostream>
// 使用标准命名空间,这样可以直接使用 std 中的元素,如 cout、cin 等
using namespace std;
// 定义一个字符数组 encoder,前几个元素为 'C'、'S'、'P',其余后续会填充,末尾以 0 作为初始部分结束标记
char encoder[26] = {'C', 'S', 'P', 0};
// 定义一个字符数组 decoder,用于存储解码映射
char decoder[26];
// 定义一个字符串 st,用于存储输入的字符串
string st;
int main() {
// 初始化变量 k 为 0,用于记录 encoder 中已有的有效字符数量
int k = 0;
// 遍历 encoder 数组,统计其中非 0 的字符数量
for (int i = 0; i < 26; ++i)
if (encoder[i] != 0)
++k;
// 遍历从 'A' 到 'Z' 的每个大写字母
for (char x = 'A'; x <= 'Z'; ++x) {
// 初始化 flag 为 true,用于标记当前字母 x 是否在 encoder 中
bool flag = true;
// 遍历 encoder 数组,检查 x 是否存在于其中
for (int i = 0; i < 26; ++i)
if (encoder[i] == x) {
// 如果存在,将 flag 设为 false,并跳出内层循环
flag = false;
break;
}
// 如果 flag 为 true,说明 x 不在 encoder 中,将其添加到 encoder 中,k 自增
if (flag) {
encoder[k] = x;
++k;
}
}
// 根据 encoder 构建 decoder 解码映射,encoder 中索引为 i 的字符,在 decoder 中对应位置为 i + 'A'
for (int i = 0; i < 26; ++i)
decoder[encoder[i] - 'A'] = i + 'A';
// 从标准输入读取字符串到 st 中
cin >> st;
// 遍历输入的字符串 st,对每个字符进行解码
for (int i = 0; i < st.length(); ++i)
st[i] = decoder[st[i] - 'A'];
// 输出解码后的字符串
cout << st;
// 主函数返回 0,表示程序正常结束
return 0;
}
程序整体功能、流程与用途
- 功能:该程序主要实现了一种基于自定义编码表的字符串编码与解码功能。首先构建一个包含所有大写字母(补充初始未包含的)的编码表
encoder
,然后根据encoder
构建解码表decoder
,最后将输入的字符串按照解码表进行解码并输出。 - 流程:
- 初始化
encoder
数组,前几个元素为'C'
、'S'
、'P'
,其余初始为0
。 - 统计
encoder
中已有的非0
字符数量k
。 - 遍历所有大写字母,将
encoder
中没有的大写字母补充到encoder
中,使encoder
最终包含所有26个大写字母。 - 根据
encoder
构建decoder
,decoder
的索引由encoder
中字符与'A'
的差值确定,对应的值为该索引加上'A'
。 - 输入字符串
st
,遍历st
的每个字符,利用decoder
对每个字符进行解码(通过字符与'A'
的差值作为索引查找decoder
)。 - 输出解码后的字符串。
- 初始化
- 用途:可用于简单的字符串编码解码场景,帮助理解编码表的构建以及基于编码表的字符转换过程,是学习字符映射和字符串处理的一个示例。
对于题目中的判断“输入的字符串应当只由大写字母组成,否则在访问数组时可能越界。 ()”,答案是正确。因为代码中在解码时,使用st[i] - 'A'
作为decoder
的索引,若输入的字符不是大写字母,st[i] - 'A'
的结果可能超出0 - 25
的范围,从而导致访问decoder
数组越界。2
0 条评论
目前还没有评论...