- 全国计算机等级考试教程:二级C语言程序设计
- 全国计算机等级考试教材编写组
- 2830字
- 2020-06-26 14:08:27
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