一、C语言的字符
1. C语言不存在字符串类型
C语言有字符类型,也就是char类型,char类型的数据占内存大小为1字节。C语言中不存在字符串类型!
2. C语言涉及的常见字符集
字符是一种图形符号,不同国家不同地区都有自己特殊的字符,于是就衍生了“字符集合”这个名词。其中ASCII (American Standard Code for Information Interchange: 美国信息交换标准代码)是国际通用的标准字符集,在网上随时可以找到标准ASCII表格(http://c.biancheng.net/c/ascii/),部分截图如下。
简单解读:
(1)使用一个字节来表示一个字符,也就是8个二进制位,并且第8个位都是0,2^7=128[0~127]。ASCII表的第一列是字符的二进制值,第二列是十进制,第三列是十六进制。一般是记忆字符的十进制ASCII值。
(2)ASCII可分为两种字符:33个不可显示字符 + 95个可显示字符。
(3)不可显示字符。可理解为无法在文本上进行显示的字符,但是能影响文本的显示或者具有某种特殊的控制功能,下面是几个特殊的不可显示字符:
A.空字符NULL: ASCII值为0,用于占据一个位置,这个位置可以继续使用(如字符串拼接)。空字符多用于字符串中,所以空字符也称为“字符串结束符”,表示一个字符串结束了,空字符之前的字符就是该字符串的最后一个字符。注意空字符和空格字符是两个不一样的字符,空格字符的ASCII值为32,如下:
B. 回车符 回车符CR(Carriage Return:回车),ASCLL值是13。控制光标移动到当前行的开头(左边界)。
C.换行符 换行符LF(Line Feed):ASCLL值是10。控制光标移动到当前行的下一行。
D. 水平制表符 水平制表符HT(Horizontal Tab):ASCLL值是9。一般被定义为4/8个空格的宽度。
E.反斜杠字符 ‘\’: ASCLL值是92
|
(4)转义字符
对于上面列出的不能显示的字符,在程序中如何使用?肯定是不能直接使用其ASCII的,C语言中,定义了“转义字符”。使用组合:反斜杠+某个字母,来表示不能显示的字符,由于这些字符是固定的表示,在C语言中,可以汇总成一张表,转义字符表:
转义字符 |
意义 |
ASCII码值(十进制) |
\a |
响铃(BEL) |
007 |
\b |
退格(BS) ,将当前位置移到前一列 |
008 |
\f |
换页(FF),将当前位置移到下页开头 |
012 |
\n |
换行(LF) ,将当前位置移到下一行开头 |
010 |
\r |
回车(CR) ,将当前位置移到本行开头 |
013 |
\t |
水平制表(HT) (跳到下一个TAB位置) |
009 |
\v |
垂直制表(VT) |
011 |
\\ |
代表一个反斜线字符''\' |
092 |
\' |
代表一个单引号(撇号)字符 |
039 |
\" |
代表一个双引号字符 |
034 |
\? |
代表一个问号 |
063 |
\0 |
空字符(NUL) |
000 |
\ddd |
1到3位八进制数所代表的任意字符 |
三位八进制 |
\xhh |
十六进制所代表的任意字符 |
十六进制 |
注:反斜杠+某个字母,表示的是一个字符。并不是反斜杠字符加另一个字符;回车和换行符经常组合到一起使用\r\n;
(5)可显示字符
A. 10个数字字符0[ASCII: 48]~9[ASCII: 57] B. 26个大写字母A[ASCII: 65]~Z[ASCII: 90]和26个小写字母a[ASCII: 97]~z[ASCII: 122] C. 标点和可显示的特殊字符[键盘上的字符,输入后能在txt文本上显示的]:{}、[]、!、@、#、?……
注:对于ASCII值,数字字符 < 大写字符 < 小写字符。 |
3.C语言如何存储一个ASCII字符
C语言可以使用一个字符类型的变量来存储一个字符,使用单引号将字符括起来,赋值给变量,对于字符变量,可以使用%c格式化输出单个字符。示例程序如下:
int main(void) { char num_0 = '0'; char num_1 = '1'; char num_2 = '2'; char ch_cr = '\r'; char ch_lf = '\n'; char num_3 = '3'; char num_4 = '4'; char num_5 = '5'; char ch_tab = '\t'; char num_6 = '6';
printk("%c", num_0); printk("%c", num_1); printk("%c", num_2);
printk("%c", ch_lf); printk("%c", ch_cr);
printk("%c", num_3); printk("%c", num_4); printk("%c", num_5); printk("%c", ch_tab); printk("%c", num_6);
printk("%c", ch_lf); printk("%c", ch_cr);
return 0; } |
运行结果如下:
4. 字符的大小比较
C语言字符大小的比较,实际上比较的是ASCII值,示例程序如下:
输出如下:
因为字符在计算机内存中以ASCII的形式进行存储(1个字节,8个二进制位),可以直接以10进制打印出它们的值,实际上就对应ASCII表里面的ASCII值。程序如下:
输出如下:
5. 字符集的扩展
(1) EASCII
ASCII字符集使用7个二进制位(最高位第8位是0)来表示常见的字符,后来发现现有的128个字符不够用,于是对ASCII字符集进行了扩展,第8位也参与进来。这时候集合的元素个数就变成了2^8=256[0~255]个字符,增加了256-128=128个字符,这个字符集合命名为EASCII,英文全称“Extended ASCII”,可译为ASCII的扩展。它向下兼容ASCII字符集,即ASCII是EASCII的子集。
对于其他的字符集,比如GB2312、GB18030、BIG5、Unicode、UTF等字符集,涉及的就比较多,其他篇幅单独做介绍。
6. 小结
字符集和字符编码是两个不同的概念,字符集是一个集合,里面是符号,并且集合里的元素是固定的,唯一的,可确定的,是通用的(一种共识和标准)。而字符编码是字符在计算机中的存储形式,计算机只认识0和1两个数字。
下一篇: