正在载入在线练习界面,本页内容可直接阅读…
AK CSP › CSP-J 2020 第一轮真题 › 第 16 题
CSP-J 2020 第一轮 第 16 题:程序(一,替换密码解码):非大写字母是否越界
题目
#include <cstdlib>
#include <iostream>
using namespace std;
char encoder[26] = {'C','S','P',0};
char decoder[26];
string st;
int main() {
int k = 0;
for (int i = 0; i < 26; ++i)
if (encoder[i] != 0) ++k;
for (char x ='A'; x <= 'Z'; ++x) {
bool flag = true;
for (int i = 0; i < 26; ++i)
if (encoder[i] ==x) {
flag = false;
break;
}
if (flag) {
encoder[k]= x;
++k;
}
}
for (int i = 0; i < 26; ++i)
decoder[encoder[i]- 'A'] = i + 'A';
cin >> st;
for (int i = 0; i < st.length( ); ++i)
st[i] = decoder[st[i] -'A'];
cout << st;
return 0;
}
本小题
输入的字符串应当只由大写字母组成,否则在访问数组时可能越界。( )
选项
- A. 正确
- B. 错误
答案
A
题解
选 A. 正确。
关键在这句: ``cpp st[i] = decoder[st[i] - 'A']; ``
decoder 的长度是 26,合法下标为 0~25:
- 输入
'A'~'Z',减去'A'后得到 0~25,访问合法。 - 输入非大写字母,下标可能超出范围。例如按 ASCII 编码,
'a' - 'A' = 32,访问decoder[32]就越界了。
因此,题目中的说法正确。注意:越界不一定会报错或崩溃,但程序的行为不再有保证。
真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1
京公网安备11010502062986号