2.5 字符型数据

前面讲解的整型和实型与数学计算密切相关。C语言还提供了字符型数据来处理文本信息,例如,对一篇英文文章中的单词按字母的某一顺序进行排序;将某一文件中所有字符的ASCII码值加上10等。字符型数据就是用来表示英文字母、符号和汉字的数据。

2.5.1 字符变量

字符变量的类型说明符是char,其定义的一般形式如下:

char 变量名1[,变量名2,…];

例如

charc1,c2;c1=´a´;c2=´b´;

这样就定义了两个字符型的变量c1和c2,并分别赋值为字符型常量´a´和´b´ 。

说明

字符值是以ASCII码值的形式存放在变量的内存单元之中的。例如,a的十进制ASCII码值是97,b的十进制ASCII码值是98。对字符变量c1赋予a值,即“c1=´a´;”,实际上是在相应的存储单元中存放97的二进制代码:

c100100001

在VC6.0中,字符型数据占1字节,因此字符型变量的值实质上是一个8位的整数值,取值范围一般是 -128~127。char型变量也可以加修饰符unsigned,unsigned char型变量的取值范围是0~255。

2.5.2 字符常量

学习提示

【理解】转义字符的形式及功能

什么是字符常量呢?从表现形式上来说,就是用一对单引号括起来的单个字符。

例如

´a´,´b´,´#´,´+´都是合法的字符常量 。

说明

在使用字符常量的时候应该注意,字符常量只能用单引号括起来,不能用双引号或其他符号。

字符可以是字符集中任意字符,也就是说数字加上单引号就成为字符了。例如,´ 1´和1是不同的,´1´是字符常量,1是数值常量。

对于字符型数据,除了可以直接用单引号来表示以外,如´a´、´ 0´、´A´,也可以用该字符的ASCII码值表示,例如,十进制数65表示大写字母A。

除了以上形式的字符常量外,C语言还允许使用一种以特殊形式出现的字符常量,以表示某些非图形字符,这就是以“\”开头的转义字符序列。在前面章节中,曾使用“\n”来表示换行。“\n”实际上是一个字符,它的ASCII码值为10。常见的以“\”开头的转义字符如表2-3所示。

表2-3 转义字符表

【例2-3】转义字符的使用。

程序代码

#include<stdio.h>

void main( )

{ int a,b,c;/*定义了3个变量*/

 a=0;

 b=1;

 c=2;/*分别对单个整型变量赋初值*/

 printf("%d\n\t%d-%d\n>>%d-%d\

t\b%d\n",a,b,c,a,b,c);

/*输出3个整型变量的值*/

根据“printf("%d\n\t%d-%d\n>>%d-%d\t\b%d\n",a,b,c,a,b,c);”语句,并结合表2-3,一起来分析程序的输出结果。

●程序在第1列输出a值0之后遇到转义字符“\n”,回车换行。

●遇到转义字符“\t”,于是跳到下一制表位置,再输出b值1。

●输出一个字符“-”,紧接着再输出c值2。

●又遇到转义字符“\n”,因此再回车换行。

●输出两个“>”字符之后又输出 a值0。

●再输出字符“-”,又输出b值1。

●再次遇到转义字符“\t”,跳到下一制表位置,但下一转义字符“\b”又使退回一格,最后输出c值2。

程序的输出结果如下:

   0

        1-2

   >>0-2

请注意

字符变量的取值是字符常量,也就是说字符变量用于存放一个字符常量(切记,不要以为在一个字符型变量中可以存放一个字符串,即包括若干个字符)。

2.5.3 字符型数据的运算

学习提示

【理解】字符型数据的运算原理

C语言把字符型数据当作一个较小的整型数据,可以像使用整型量一样使用它,下面来看一个例子。

【例2-4】对字符变量的运算。

程序代码

#include<stdio.h>

void main( )

{ char c1=´a´;/*定义一个字符变量c1,

并且初始化为字符常量a*/

 char c2;/*定义一个字符变量c2*/

 c2=c1-(´a´-´A´);

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

/*输出字符变量c2*/

分析程序可知,程序中的“´a´-´A´”是大小写字母之间的差值,参加运算的是两个字符所对应的ASCII码值“97”和“65”,故运算结果为32。也可以把语句写成“c2=c1-32;”,其效果是一样的。最终程序的运行结果是输出字符“A”。

C语言允许对整型变量赋予字符值,也允许对字符变量赋予整型值。在输出时,可以将字符变量按整型量输出,也可以将整型量按字符量输出。

例如

printf("%d",´A´);

程序运行结果为65,即输出的是字符“A”的ASCII码值。

2.5.4 字符串常量

C语言除了允许使用字符常量外,还允许使用字符串常量。字符串常量是用一对双引号("")括起来的零个或多个字符的序列。

例如

"CHINA"和 "0123456789"都是字符串常量。

在存储字符串常量时,由系统在字符串的末尾自动加一个“\0”作为字符串的结束标志。

如果有一个字符串为“CHINA”,则它在内存中的实际存储如图2-2所示。

图2-2 字符串常量在内存中的存储

最后一个字符“\0”是系统自动加上的,即字符串“CHINA”占用了6个字节的内存空间。

有很多人不能理解´a´和"a"的区别,那是因为他们不能正确理解字符常量和字符串常量的区别。下面就从表示方法、内存中的存储方式等方面来对二者进行比较。

字符常量使用单引号,而字符串常量使用双引号。例如,´a´表示的是字符常量,而"a"则表示的是只有一个字符长度的字符串常量。

二者在内存中的存储也不同,字符常量存储的是字符的ASCII码值,而字符串常量除了要存储有效的字符外,还要存储一个“字符串结束标志(\0)”,以便系统判断字符串是否结束。例如,字符常量´a´在内存中占一个字节,其存储形式如图2-3所示。

而字符串常量占用的字节数是字符串的总长度加1。额外增加的一个字节用于存放字符“\0”。其在内存中的存储形式如图2-4所示。

图2-4 字符串常量在内存中的存储

在实际应用时,可以把一个字符常量赋予一个字符型变量,但不能把一个字符串常量赋予一个字符变量。在 C语言中没有相应的字符串变量。但是可以用一个字符数组来存放一个字符串常量。字符数组将在数组一章介绍。

真题演练

【例1】已知大写字母“A”的ASCII码值是65,小写字母“a”的ASCII码值是97。以下不能将变量c中的大写字母转换为对应小写字母的语句是( )。

A)c=(´A´+c)% 26- ´a´

B)c=c+32

C)c=c- ´A´+´a´

D)c=(c- ´A´)% 26+´a´

【解析】根据题意可知,小写字母比与之对应的大写字母的ASCII码值大32。选项A中,字符A加上c表示的大写字符再对字母个数26取余,本身这个表达式没有任何含义,所以选择选项A。

【答案】A

【例2】下面选项中合法的字符常量是( )。

A)"X"

B)´X´

C)´abc´

D)´\´

【解析】字符常量是用单引号括起来的一个字符。选项A中,使用双引号,故错误;选项 C中,字符常量只能是单个字符,不能是一串字符,故错误;选项D中,以反斜线“\”开头的是转义字符。因此选项B正确。

【答案】B

【例3】若有定义语句:charc=´\101´;,则变量c在内存中占( )。

A)1个字节

B)2个字节

C)3个字节

D)4个字节

【解析】本题考查字符变量的存储空间,每个字符变量被分配一个字节的内存空间。因此选项 A正确。

【答案】A

【例4】若有以下程序:

#include<stdio.h>

main( )

{ charc1,c2;

 c1=´C ´+´ 8´- ´3´;c2=´ 9´- ´ 0´;

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

 }

则程序的输出结果是( )。

A)H ´ 9´

B)H9

C)F ´ 9´

D)表达式不合法,输出无定值

【解析】本题考查字符变量以及printf( )函数相关知识。字符变量c1被赋值为“´C ´+´ 8´- ´3´”,即ASCII码值的运算,67+54-49=72,即“´H´”;字符变量c2被赋值为“´9´- ´0´”,但输出时需要注意的是,c1以字符变量输出,而c2是以十进制整型变量输出。因此选项B正确。

【答案】B