C++数据类型之字符类型详解
- 引言
- 一、背景知识
- 二、字符常量
- 三、字符变量
- 四、键盘(输入设备)给字符变量赋值
- 五、字符常量和字符串常量的区别
- 六、案例:字符大小写转换
- 总结
引言
💡 作者简介:专注于C/C++高性能程序设计和开发,理论与代码实践结合,让世界没有难学的技术。包括C/C++、Linux、MySQL、Redis、TCP/IP、协程、网络编程等。
👉
🎖️ CSDN实力新星,社区专家博主
👉
🔔 专栏介绍:从零到c++精通的学习之路。内容包括C++基础编程、中级编程、高级编程;掌握各个知识点。
👉
🔔 专栏地址:C++从零开始到精通
👉
🔔 博客主页:https://blog.csdn.net/Long_xu
🔔 上一篇:【003】C++数据类型之整型变量(int)详解
一、背景知识
char类型是另一种整型。char类型是专门为存储字符而设计的。现在,存储数字对于计算机来说算不了什么,但存储字母则是另一种回事,编程语言通过使用字母的数值编码解决这个问题;因此,char类型是另一种整型。很多系统支持的字符不超过128个,因此可以使用一个字节就能表示所有符号。
虽然char常用来处理字符,但也可以将它用做比short更小的整型。
ASCII码表是一个标准字符编码系统,用来将数字、字母、符号和其他可打印和非打印字符转换成二进制代码。以下是ASCII码表的部分内容:
十进制 | ASCII字符 | 二进制 |
---|---|---|
0 | NUL(空字符) | 0000 0000 |
1 | SOH(标题开始) | 0000 0001 |
2 | STX(正文开始) | 0000 0010 |
3 | ETX(正文结束) | 0000 0011 |
4 | EOT(传输结束) | 0000 0100 |
5 | ENQ(请求) | 0000 0101 |
6 | ACK(确认响应) | 0000 0110 |
7 | BEL(响铃) | 0000 0111 |
8 | BS(退格) | 0000 1000 |
9 | TAB(水平制表符) | 0000 1001 |
10 | LF(换行) | 0000 1010 |
11 | VT(垂直制表符) | 0000 1011 |
12 | FF(换页) | 0000 1100 |
13 | CR(回车) | 0000 1101 |
14 | SO(移位输出) | 0000 1110 |
15 | SI(移位输入) | 0000 1111 |
16 | DLE(数据链路转义) | 0001 0000 |
17 | DC1(设备控制1) | 0001 0001 |
18 | DC2(设备控制2) | 0001 0010 |
19 | DC3(设备控制3) | 0001 0011 |
20 | DC4(设备控制4) | 0001 0100 |
21 | NAK(否定响应) | 0001 0101 |
22 | SYN(同步空闲) | 0001 0110 |
23 | ETB(传输块结束) | 0001 0111 |
24 | CAN(取消) | 0001 1000 |
25 | EM(媒介结束) | 0001 1001 |
26 | SUB(替换) | 0001 1010 |
27 | ESC(转义) | 0001 1011 |
28 | FS(文件分隔符) | 0001 1100 |
29 | GS(组分隔符) | 0001 1101 |
30 | RS(记录分隔符) | 0001 1110 |
31 | US(单元分隔符) | 0001 1111 |
32 | SPACE(空格) | 0010 0000 |
33 | ! | 0010 0001 |
34 | " | 0010 0010 |
35 | # | 0010 0011 |
36 | $ | 0010 0100 |
37 | % | 0010 0101 |
38 | & | 0010 0110 |
39 | ’ | 0010 0111 |
40 | ( | 0010 1000 |
41 | ) | 0010 1001 |
42 | * | 0010 1010 |
43 | + | 0010 1011 |
44 | , | 0010 1100 |
45 | - | 0010 1101 |
46 | . | 0010 1110 |
47 | / | 0010 1111 |
48 | 0 | 0011 0000 |
49 | 1 | 0011 0001 |
50 | 2 | 0011 0010 |
51 | 3 | 0011 0011 |
52 | 4 | 0011 0100 |
53 | 5 | 0011 0101 |
54 | 6 | 0011 0110 |
55 | 7 | 0011 0111 |
56 | 8 | 0011 1000 |
57 | 9 | 0011 1001 |
58 | : | 0011 1010 |
59 | ; | 0011 1011 |
60 | < | 0011 1100 |
61 | = | 0011 1101 |
62 | > | 0011 1110 |
63 | ? | 0011 1111 |
64 | @ | 0100 0000 |
65 | A | 0100 0001 |
66 | B | 0100 0010 |
67 | C | 0100 0011 |
68 | D | 0100 0100 |
69 | E | 0100 0101 |
70 | F | 0100 0110 |
71 | G | 0100 0111 |
72 | H | 0100 1000 |
73 | I | 0100 1001 |
74 | J | 0100 1010 |
75 | K | 0100 1011 |
76 | L | 0100 1100 |
77 | M | 0100 1101 |
78 | N | 0100 1110 |
79 | O | 0100 1111 |
80 | P | 0101 0000 |
81 | Q | 0101 0001 |
82 | R | 0101 0010 |
83 | S | 0101 0011 |
84 | T | 0101 0100 |
85 | U | 0101 0101 |
86 | V | 0101 0110 |
87 | W | 0101 0111 |
88 | X | 0101 1000 |
89 | Y | 0101 1001 |
90 | Z | 0101 1010 |
91 | [ | 0101 1011 |
92 | \ | 0101 1100 |
93 | ] | 0101 1101 |
94 | ^ | 0101 1110 |
95 | _ | 0101 1111 |
96 | ` | 0110 0000 |
97 | a | 0110 0001 |
98 | b | 0110 0010 |
99 | c | 0110 0011 |
100 | d | 0110 0100 |
101 | e | 0110 0101 |
102 | f | 0110 0110 |
103 | g | 0110 0111 |
104 | h | 0110 1000 |
105 | i | 0110 1001 |
106 | j | 0110 1010 |
107 | k | 0110 1011 |
108 | l | 0110 1100 |
109 | m | 0110 1101 |
110 | n | 0110 1110 |
111 | o | 0110 1111 |
112 | p | 0111 0000 |
113 | q | 0111 0001 |
114 | r | 0111 0010 |
115 | s | 0111 0011 |
116 | t | 0111 0100 |
117 | u | 0111 0101 |
118 | v | 0111 0110 |
119 | w | 0111 0111 |
120 | x | 0111 1000 |
121 | y | 0111 1001 |
122 | z | 0111 1010 |
123 | { | 0111 1011 |
124 | | | 0111 1100 |
125 | } | 0111 1101 |
126 | ~ | 0111 1110 |
127 | DEL(删除) | 0111 1111 |
二、字符常量
C++中的字符常量用单引号括起来,表示一个字符。例如:
char c = 'a';
在单引号内可放任何一个字符,包括字母、数字、符号等。如果要表示某些特殊字符(如回车符、换行符等),可以使用转义字符来表示。例如:
char c1 = '\n'; // 换行符
char c2 = '\t'; // 制表符
char c3 = '\''; // 单引号
char c4 = '\"'; // 双引号
char c5 = '\\'; // 反斜杠
还有一种特殊的字符常量是空字符(Null Character),用’\0’表示。它表示空字符,也就是字符串的结束标志符。例如:
char str[] = "hello world"; // 字符串常量
char c6 = '\0'; // 空字符
输出字符和字符ASCII值的方式:
cout<<'a'<<endl;// 输出的是字符
cout<<(int)'a'<<endl;// 输出的是字符的ASCII值 97
三、字符变量
C++中的字符变量是一种用来存储单个字符的数据类型,通常使用char关键字定义。每个字符常量被分配一个字节的内存空间,字符值以ASCII码的形式存放在变量的内存单元中;它可以存储任何ASCII码字符,包括字母、数字、标点符号、空格等。
例如,下面是一个定义字符变量并赋值的示例:
char ch = 'A';
在这个示例中,定义了一个名为ch的字符变量,并将其初始化为小写字母A。
除了单引号中的字符外,还可以通过其ASCII码值来初始化字符变量。例如:
char ch = 65;
这将把字符变量ch的值设置为ASCII码为65的字符,即大写字母A。
ch变量中存放的是字符’A’的ASCII值65,即ch=65和ch='A’在本质上是一致的。
字符变量的初始化:
char ch='\0';
注意 '\0’和0和数值0的区别:
-
'\0’代表ASCII码中的空字符,也称为null字符或者零终止符号。它是一个字符类型,占用1个字节的空间。
-
0是一个整数类型,表示十进制中的数字0。它占用4个字节的空间。
-
数值0是一个整数类型,表示十进制中的数字0。它占用4个字节的空间。
它们之间的区别在于数据类型和存储空间大小。‘\0’只是一个字符,而0和数值0则是整型数字,大小为4个字节。在某些情况下,’\0’可能被视为数值0,但是它们的数据类型不同,不能通用。
四、键盘(输入设备)给字符变量赋值
char ch='\0';
cout<<"请输入一个字符:";
cin>>ch;
cout<<"ch = "<<ch<<endl;
注意:
- cin会判断ch的类型为char,一次只读一个字母
- cin会跳过起始的空格和回车。
请输入一个字符: abcd
ch=a
五、字符常量和字符串常量的区别
-
表示方式不同:字符常量用单引号括起来,例如 ‘a’;而字符串常量用双引号括起来,例如 “hello world”。
-
数据类型不同:字符常量是一个字符,数据类型是 char;而字符串常量是一串字符数组,数据类型是 const char*。
-
存储方式不同:字符常量存储在内存中的一个字符单元中,字符串常量则是以 null 结尾的字符数组,存储在静态存储区域(即常量区)。
-
赋值方式不同:字符常量可以直接赋值给 char 类型的变量,例如 char a = ‘a’;而字符串常量需要使用 strcpy() 函数或者初始化语法赋值给 char* 类型的变量,例如 const char* str = “hello world”; 或者 char str[] = “hello world”;。
-
操作方式不同:对于字符常量,可以进行逻辑运算、比较操作等;而对于字符串常量,只能使用字符串函数库进行操作,例如 strlen、strcpy、strcat 等。
六、案例:字符大小写转换
键盘输入一个字符,如果是大写就改成小写,如果是小写就改写成大写,其他字符不改变。
#include <iostream>
using namespace std;
int main()
{
char ch='\0';
cout<<"请输入一个字符:";
cin>>ch;
if(ch>='a' && ch<='z')
ch=ch-('a'-'A');
else if(ch>='A' && ch<='Z')
ch=ch+('a'-'A');
cout<<"ch = "<<ch<<endl;
}
示例中使用了一个规律,就是每个大小写直接的差值是一样的。
总结
-
char类型表示单个字符,占用一个字节(8位),范围为-128~ 127或0~255(取决于是否使用有符号类型)。
-
可以使用单引号将字符括起来,例如:‘a’、‘B’、'1’等。
-
还可以使用转义字符表示一些特殊的字符,例如:‘\n’表示换行符、’\t’表示制表符等。
-
char类型变量可以被赋值为字符常量、字符变量和字符表达式等。
-
字符串是由多个字符组成的序列,可以用char数组或string类型表示。
-
char类型也可以用于输入输出操作,例如:cin和cout等。
-
C++中还提供了许多对char类型进行操作的函数,例如:strlen、strcat、strcpy等。
-
在ASCII编码中,每个字符都对应一个唯一的整数值,可以通过强制类型转换将字符转换为对应的整数值,例如:int(‘a’)的结果为97。
-
Unicode是一种字符集,它包含了世界上大部分的字符,可以通过wchar_t类型来表示。