正在载入在线练习界面,本页内容可直接阅读…

AK CSP › CSP-J 2020 第一轮真题 › 第 16 题

CSP-J 2020 第一轮 第 16 题:程序(一,替换密码解码):非大写字母是否越界

阅读程序 · 数组与字符串 · 难度 中等 · 答案 A

题目

#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;
}
CSP-J 2020 第一轮 第 16 题 原题
原题扫描(页面加载后可直接在线作答)

本小题

输入的字符串应当只由大写字母组成,否则在访问数组时可能越界。( )

选项

  • 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号