C语言的数据类型→字符型数据

 

一、字符常量 

C语言的字符常量是用单撇号括起来的一个字符。

如:'a'  、'x'  、'D' 、 '?' 、 '$'  等都是字符常量。

注意:'a'  、 'A'是不同的字符常量。

C语言有一个特殊之处,就是允许用一种特殊形式的字符常量,就是以一个字符“\”开头的字符序列。

二、常用的以“\”开头的特殊形式见下表:

                           转义字符及其作用

 

            C语言的数据类型→字符型数据

    说明:上表中列出的字符称为“转义字符”,意思是将反斜杠“\”后面的字符转换成另外的意义。如“\n”中的“n”不代表字母n而作为“换行”符。

上表中倒数第二行是一个ASCII码(八进制数)表示一个字符:

例如“\101”代表ASCII码(八进制数)为101的字符“A”。

      八进制数101相当于十进制数65,而ASCII为65代表的字符是大写字母'A'。

     “\012”代表八进制数12(即十进制数的10)的ASCII码所对应的字符“换行”符。

                    用上表中的方法可以表示任何可输出的字母字符、专用字符、图形字符和控制字符。

       注意:“\0”或“\000”是代表ASCII码为0的控制字符,即“空操作”字符。它常用在字符串中。

 例如:

 C语言的数据类型→字符型数据    运行结果:C语言的数据类型→字符型数据C语言的数据类型→字符型数据

 

三、字符变量

    字符型变量用来存放字符常量,它只能存放一个字符,不要以为在一个字符变量中可以放一个字符串(包括若干字符)。

字符变量的定义形式如下:

char  c1,c2;

它表示c1和c2为字符型变量,各可以放一个字符,因此在本函数中可以用下面语句对c1、c2赋值:

c1='a' ; c2='b' ;

    在所有的编译系统中都规定以一个字节来存放一个字符,或者说一个字符变量在内存中占一个字节。

、字符数据在内存中的存储形式及其使用方法

    将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII代码放到存储单元中。

    例如字符'a'的ASCII代码为十进制数97,'b'的ASCII代码为十进制数98,在内存中变量c1、c2的值如下图(a)所示:

实际上是以二进制形式存放的,如下图(b)所示:

                                                     C语言的数据类型→字符型数据

    既然在内存中,字符数据是以ASCII码存储,它的存储形式就与整数的存储形式类似。这样就使字符型数据和整型数据之间可以通用。一个字符型数据既可以以字符型输出,也可以以整数形式输出。以字符形式输出时,需要先将存储单元中的ASCII码转换成相应字符,然后输出。也可以对字符数据进行算术运算,此时相当于对它们的ASCII码进行算术运算。

 例如:向字符变量赋予整数:

C语言的数据类型→字符型数据 运行结果:C语言的数据类型→字符型数据

    说明:c1,c2被指定为字符变量。在第五行和第六行中,将整数97和98分别赋予c1,c2,它的作用相当于以下两个赋值语句:

c1='a';c2='b';

    因为'a'和'b'的ASCII码为97和98。总结:字符型数据和整型数据是通用的。但是我们应该注意,字符型数据只占一个字节,它只能存放0 … 255范围内的整数(详细见下面的“特别强调”)。

 例如:大小写字母的转换。

C语言的数据类型→字符型数据 运行结果:C语言的数据类型→字符型数据

 说明:程序的作用是将两个小写字母a和b转换成大写字母A和B。

    我们可以从代码中可以看到每一个小写字母比它相应的大写字母的ASCII码大32。C语言允许字符数据与整数直接进行算术运算。

           C语言对字符数据做这种处理使程序设计时增大了*度。例如对字符做各种转换就比较方便:

字符数据与整型数据可以互相赋值:

int i;

char c;

i='a';

c=97;

上述赋值是合法的。如果用格式符“%d”将i的值输出可得到97。用“%c”输出可得到字符'a'。

如果在上面语句之后执行以下语句:

 printf(""%c,%d\n",c,c);

printf("%c,%d\n",i,i);

输出:

a,97

a,97

    特别强调的是:有些系统(如Turbo C)将字符变量定义为signed char型。其存储单元中的最高位作为符号位,它的取值范围是-128…127。如果在字符变量中存放一个ASCII码为0…127间的字符,由于字节中最高位为0,所以用%d输出字符变量时,输出的是一个正整数。如果在字符变量中存放一个ASCII码为128…255间的字符,由于在字节中最高位为1,用%d格式输出时,就会得到一个负整数。 

    如果不想按有符号处理,可以将字符变量定义为unsigned char类型,这时其取值范围是0…255。signed char和unsigned char的含义及用法与signed int 和unsigned int 相仿,但它只有一个字节。

五、字符串常量

字符常量是由一对单撇号括起来的单个字符

字符串常量是一对双撇号括起来的字符序列

如:"How do you do." , "CHINA" ,"a" , "$123.45"

可以输出一个字符串:printf("How do you do.");

注意:我们千万不能将字符常量与字符串常量混淆。'a'是字符常量,"a"是字符串常量,二者不同。

假设c被指定为字符变量:

char c;

c='a';

是正确的。

c="a";

是错误的。

c="CHINA";

也是错误的。不能把一个字符串常量赋给一个字符变量。

注意:'a'和"a"究竟有什么区别?

    C语言规定:在每一个字符串常量的结尾加一个“字符串标志”,以便系统据此判断字符串是否结束。C语言以字符'\0'作为字符串结束标志。'\0'是一个ASCII码为0的字符,从ASCII代码中可以看到ASCII码为0的字符是“空操作字符”,即它不引起任何控制动作,也不是一个可显示的字符。如果有一个串常量"CHINA",实际上在内存中是:

C语言的数据类型→字符型数据

它占内存单元不是5个字符,而是6个字符,最后一个字符为'\0'。但在输出时不输出'\0'。例如printf("How do you do.");,从第一个字符开始逐个输出字符,直到遇到最后的'\0'字符,就知道字符串结束,停止输出。

    注意:在写字符串时不必加'\0',否则会画蛇添足。'\0'字符是系统自动加上的。字符串"a"实际上包含2个字符:'a'、'\0',因此,想把它赋给只能容纳一个字符的字符变量c显然是不行的。

    c="a"; /*错误,c是字符变量*/

    在C语言中没有专门的字符串变量,如果想将一个字符串存放在变量中以便保存,必须使用字符数组,即用一个字符型数组来存放一个字符串,数组中每一个元素存放一个字符。