Skip to content

第 6 课:字符类型与 ASCII 码 ​

前面我们存储的都是数(整数或小数),现在蛙蛙想存储字母,例如输入 k 这样的字母,他还是使用 int/double 进行输入输出,你觉得他能成功吗?他是这样写的:

cpp
#include <iostream>
using namespace std;
int main()
{
    double a;
    cin >> a;
    cout << a;
    return 0;
}

在控制台上输入 k,蛙蛙发现结果竟然是 0,而不是他想输出的字母 k,这是为什么呢?

这是因为我们输入 k 时,cin >> a; 这行代码会出现输入错误。因为变量 a 是 double 类型,而输入的 k 并不是一个数,所以 cin 操作失败。

在这种情况下,a 的值不会被正确设置,它可能会保持其未初始化的值(通常是一个不确定的垃圾值),但有些编译器可能会将其初始化为 0,所以蛙蛙输出 a 时,就看到了 0。

为了帮助蛙蛙存储字母,氪町博士告诉他,想要保存字母,可以声明一个字符类型的变量。

所谓字符,就是指计算机中使用的字母、数字和符号,例如 26 个大小写英文字母、数字 0~9 和一些特殊的符号,如 #、@、+、- 等。

字符类型(char)是一种数据类型,和实数类型、整型类似,不同的是一个字符类型变量可存储的内容为单个字符。

6.1 ASCII 码 ​

计算机其实是不能直接识别字符的,因此,字符不能直接存储在计算机中。

但是可以利用 ASCII 码(数字)来存储字符。简单来说,ASCII 码就相当于字符对应的数字编号,只要知道编号,就知道是哪个字符了。

举个小例子,在学校里,每个学生的个人信息都是通过学号来记录的,知道了这个学生的学号,就知道是哪个学生了,ASCII 码就类似于学生的学号。

常用字符的 ASCII 码 ​

  1. 数字字符:'0' 到 '9' 的 ASCII 码值分别为 48 到 57,即 '0' 的 ASCII 码是 48,'1' 的 ASCII 码是 49,以此类推。

  2. 大写字母:'A' 到 'Z' 的 ASCII 码值分别为 65 到 90,即 'A' 的 ASCII 码是 65,'B' 的 ASCII 码是 66,以此类推。

  3. 小写字母:'a' 到 'z' 的 ASCII 码值分别为 97 到 122,即 'a' 的 ASCII 码是 97,'b' 的 ASCII 码是 98,以此类推。

ASCII 码实例说明 ​

要声明一个字符类型的变量 a,并赋值为 k,即 char a = 'k';。

这里字符类型变量 a 存储的就是代表字符 k 的 ASCII 码 107,而不是字符 k 本身。

6.2 字符类型 ​

  • 定义格式:char a; // (数据类型)(变量名)
  • 赋值:a = 'k'; // 将字符 k 赋值给变量 a
  • 输入:cin >> a;
  • 输出:cout << a;

注意

  1. 字符类型变量的输入和输出均与整数类型、实数类型一致。

  2. 在控制台输入的时候直接输入字符即可,但是赋值的时候不能忘记字符两边的单引号,比如上面的赋值 a = 'k'。

例 1:巧克力上的字母 ​

蛙蛙爸爸出差回来,给蛙蛙带回来一些美味的巧克力。细心的蛙蛙发现,每块巧克力上面都刻着一个字符。他想把巧克力上的字符记录下来,经过一番操作,他记录了两个字符。

【输入格式】输入一行,两个字符。

【输出格式】输出一行,两个字符,用空格隔开。

【输入样例】l v

【输出样例】l v

解析

  1. 定义变量。首先定义两个 char 类型的变量,char 类型用于存储单个字符。

  2. 字符输入。通过 cin 语句,输入这两个变量。

  3. 字符输出。最后通过 cout 进行输出,按照顺序先输出第一个变量对应的字符,然后输出一个空格(通过 " " 来表示一个空格字符),接着输出第二个变量对应的字符。

参考代码

cpp
#include <iostream>
using namespace std;
int main()
{
    char a,b; // 声明两个字符类型的变量 a 和 b
    cin >> a >> b; // 输入两个字符,并将其分别保存到 a 和 b 中
    cout << a << " " << b;
    return 0;
}

6.3 字符转换成 ASCII 码 ​

字符是 char 类型,而 ASCII 码是 int 类型,想要输出字符相对应的 ASCII 码,需要把 char 类型转换成 int 类型。比如输入一个字符 k,输出它的 ASCII 码 107。氪町博士准备教大家两种转换的方法。

方法一:先声明一个整型变量,再将字符赋值给整型变量进行转换。

cpp
char a = 'k';
int x;
x = a;
cout << x;

方法二:直接进行强制类型转换。

cpp
char a = 'k';
cout << (int)a;

例 2:字符对应的 ASCII 码 ​

蛙蛙已经记录完了巧克力上的字符,他还想知道字符所对应的 ASCII 码。现在他拿出两个字符,请你输出它们所对应的 ASCII 码的值。

【输入格式】输入一行,用空格隔开的两个字符。

【输出格式】输出一行,两个字符所对应的 ASCII 码的值,用空格隔开。

【输入样例】m 3

【输出样例】109 51

解析

  1. 先定义两个 char 类型的变量,用来存储需要输入的两个字符。

  2. 使用 cin 语句进行输入操作,依次读取输入的两个字符并赋值给对应的变量。例如,当输入 m 3 时,cin 会先把字符 m 赋给第一个变量,再把字符 3 赋给第二个变量。

  3. 在 C++ 里,字符类型的变量可以直接当作整数来使用,因为其存储的就是 ASCII 码的整数值。所以可以直接通过声明 int 类型的变量来存储字符,即可得到字符所对应的 ASCII 码值,也可以进行强制类型转换。

  4. 输出两个字符类型的变量所对应的 ASCII 码值,用空格隔开。

参考代码

cpp
#include <iostream>
using namespace std;
int main()
{
    char a,b;
    cin >> a >> b;
    cout << int(a) << " " << int(b);
    return 0;
}

6.4 ASCII 码转换成字符 ​

ASCII 码是 int 类型,而字符是 char 类型,所以要输出字符,需要把 int 类型转换成 char 类型。与字符转换为 ASCII 码类似,这里氪町博士还是教大家两种方法。

方法一:先声明一个字符类型变量,再将整数赋值给字符类型变量进行转换。

cpp
int a = 107;
char b;
b = a;
cout << b;

方法二:直接进行强制类型转换。

cpp
int a = 107;
cout << (char)a;

例 3:转校生的姓名 ​

班级里新来了一个转校生,蛙蛙想知道他叫什么名字,但是转校生只告诉他两个数,让他猜自己的姓名的首字母,如果猜对了,就送蛙蛙一份小礼物。已知他的姓名只有两个汉字。

【输入格式】输入一行,两个整数。

【输出格式】输出一行,以这两个整数为 ASCII 码的字母,用空格隔开。

【输入样例】108 99

【输出样例】l c

解析

  1. 先定义两个 int 类型的变量,用于接收输入的两个整数,再通过 cin 语句输入这两个整数。

  2. 然后将两个 int 类型的值转换为字符。在 C++ 中,要将整数转换为对应的 ASCII 码字符,可以使用类型转换操作。直接通过声明 char 类型的变量存储 ASCII 的值,即可得到 ASCII 所对应的字符,也可以进行强制类型转换。

  3. 最后通过 cout 语句直接输出两个 int 类型的变量所对应的字符,用空格隔开。

参考代码

cpp
#include <iostream>
using namespace std;
int main()
{
    int a,b;
    cin >> a >> b;
    cout << char(a) << " " << char(b);
    return 0;
}

6.5 字符的算术运算 ​

字符类型是可以直接进行算术运算的,计算机进行计算的时候会自动对字符所对应的 ASCII 码的值进行相应的运算,比如:

cpp
char b = 'a';
cout << b + 2;

计算的是字符 a 的 ASCII 码与 2 相加的值,所以结果是 99。两个字符也可以直接进行运算,比如:

cpp
cout << 'B' - 'b';

计算的是两个字符的 ASCII 码相减的值,结果是 32。

例 4:补习班的座位 ​

蛙蛙和 A 同学想进一步提升自己的成绩,于是一起报了同一个培优班。培优班在开课之前给每位学生都分配了一个字符,学生通过这个字符能够找到座位。

但来到班级后,同学们发现座位上都是数字。老师告诉他们,数字是字符对应的 ASCII 码,他们需要解密来找到自己的座位。蛙蛙想找到两人的座位,并想知道他的座位号比 A 同学大多少。

【输入格式】输入一行,两个用空格隔开的字符。

【输出格式】输出两行。第 1 行为两个字母所对应的 ASCII 码,以空格隔开;第 2 行为第一个字符比第二个字符大了多少。

【输入样例】b a

【输出样例】

98 97
1

解析

  1. 首先,程序使用 cin 从标准输入读取两个字符,存储在变量 a 和 b 中。

  2. 接着,使用 (int)a 和 (int)b 将字符 a 和 b 转换为它们对应的 ASCII 码,并将结果输出,用空格分隔。

  3. 最后,将字符 a 和 b 转换为 int 类型后进行减法运算,得到它们的 ASCII 码的差值。也可以直接将字符 a 和 b 相减,并将结果输出。注意输出差值前要先使用 endl 换行。

参考代码

cpp
#include <iostream>
using namespace std;
int main()
{
    char a,b;
    cin >> a >> b;
    cout << (int)a << " " << (int)b << endl;
    cout << a - b;
    return 0;
}

6.6 大小写字母转换 ​

根据 6.1 节中常用字符的 ASCII 码值,我们得知小写字母 a 的 ASCII 码值是 97,大写字母 A 的 ASCII 码值是 65,它们的差值是 32。

也就是说小写字母比对应大写字母的 ASCII 码的值大 32。所以要将小写字母转换为大写字母,只需要将其减去 32,再转换为字符类型即可。

比如我们想要输出字符 h 对应的大写字母,可以这样写:

cpp
cout << char('h' - 32);

如果我们要将大写字母转换为小写字母,只需要将其加上 32,再转换为字符类型即可。比如我们要输出字符 F 对应的小写字母,可以直接写为:

cpp
cout << char('F' + 32);

总结:将小写字母转为大写字母,直接减 32 即可;将大写字母转为小写字母,直接加 32 即可。

基于 MIT 协议发布