ASCII 码
ASCII 码
ASCII 码及字符与整数的相互转换。
概念
ASCII 用 0∼127 的整数编码常见字符:数字 '0'–'9' 连续对应 48–57,大写 'A'–'Z' 为 65–90,小写 'a'–'z' 为 97–122。C/C++ 里 char 参与运算会提升为整数,故 'a'+13 得到 110,即 'n'。字符与整数互转:char c = 65 等价于 'A';(int)(unsigned char)c 可得到 0∼255 范围的无符号值。与 cspj.cpp.string 相邻:字符串处理考 string 操作;本叶子考单个字符的编码值及 '0' 与 0 的区别。与 cspj.math.number-and-base 不同:ASCII 是固定字符表,不是任意进制换算。
CSP-J 常考
cspj-r1-2024第 8 题:(char)('a' + 13)等于哪一个字符(小写字母偏移)。cspj-r1-2021第 27 题:阅读程序处理输入串,根据字符编码规则选输出(与 Base64 解码流程相关,核心仍考字符与字节/整数对应)。
目前语料只有上述 2 道挂在本叶子的题。
#include <iostream>
using namespace std;
char c = '7';
int v = c - '0'; // 字符 '7' → 数值 7
char d = (char)('A' + 3); // 整数 68 → 字符 'D'
// 判断 c 是否为数字
bool isDigit = (c >= '0' && c <= '9');
易错点
'0'的值是 48,不是 0;'0' + 5是'5',不是 5。(char)强制转换只保留低 8 位,超出 127 的char在某些实现里可能带符号扩展,阅读题问「相等」要看是否写成unsigned char。- 大小写相差 32(
'a'-'A'),但别对非字母字符乱用这一规律。 - 完善程序空位:
z[i]-'0'是把数字字符变整数,与'a'+13的字母偏移是两种常见写法,不要混在同一循环里。
阅读程序共 3.5 分1 道小题
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
程序
1
#include <iostream>2#include <string>3using namespace std;45char base[64];6char table[256];78void init()9{10 for (int i = 0; i < 26; i++) base[i] = 'A' + i;11 for (int i = 0; i < 26; i++) base[26 + i] = 'a' + i;12 for (int i = 0; i < 10; i++) base[52 + i] = '0' + i;13 base[62] = '+', base[63] = '/';1415 for (int i = 0; i < 256; i++) table[i] = 0xff;16 for (int i = 0; i < 64; i++) table[base[i]] = i;17 table['='] = 0;18}1920string decode(string str)21{22 string ret;23 int i;24 for (i = 0; i < str.size(); i += 4) {25 ret += table[str[i]] << 2 | table[str[i + 1]] >> 4;26 if (str[i + 2] != '=')27 ret += (table[str[i + 1]] & 0x0f) << 4 | table[str[i + 2]] >> 2;28 if (str[i + 3] != '=')29 ret += table[str[i + 2]] << 6 | table[str[i + 3]];30 }31 return ret;32}3334int main()35{36 init();37 cout << int(table[0]) << endl;3839 string str;40 cin >> str;41 cout << decode(str) << endl;42 return 0;43}- 27单选3.5 分
(3.5 分)当输入为 Y2NmIDIwMjE= 时,输出的第二行为( )。
在 C/C++ 中,(char)('a' + 13) 与下面的哪一个值相等?( )