
2.2.3 字符型数据
1.字符常量
C语言中有两种类型的字符常量:
①普通字符:用单引号括起来的单个字符,例如,'a','@','1'。
②转义字符:以“\”开头的具有特殊含义的字符,常用的转义字符如表2-6所示。
表2-6 转义字符

表中列出的转义字符,意思是将反斜杠(\)后面的字符转换成另外的意义。例如,'\n'中的n不代表字母n而作为“换行符”。
表中的最后两行是用ASCII码(八进制和十六进制)表示的一个字符。例如,'\101'和'\x41'都代表ASCII码(十进制)为65的字符“A”。请注意'\0'或'\000'是代表ASCII码为0的控制字符,即“空操作”字符,它将用在字符串中。
扫一扫 看视频

【例2.5】转义字符的使用。
程序代码如下:

程序的运行结果为:
ab cde
fA
说明:程序中没有设字符变量,用printf()函数直接输出双引号内的各个字符。请注意其中的“转义字符”。第一个printf()函数先在第一行左端开始输出ab,然后遇到\t,它的作用是“跳格”,即跳到下一个“制表位置”,在本书所用系统中一个“制表区”占8列。“下一个制表区”从第9列开始,故在9~11列输出cde。下面遇到\n,作用是“跳到”下一行的起始位置。第二个printf()函数在第1列输出字符f,后面的\101代表大写字母A。
注意:在C语言中,字符常量具有一个整数值,即该字符的ASCII码值(见附录A)。因此,一个字符常量可以与整型数进行加减运算。例如,'A'+10运算是合法的,由于大写字母'A'的ASCII码值为65,所以'A'+10值是75。
2.字符串常量
字符串常量是由双引号括起来的字符序列,如"abc","a","$123.45"。
注意:不要将字符常量与字符串常量混淆。'a'是字符常量,"a"是字符串常量,二者不同。
C语言规定,任何一个字符串都有一个结束符,并指定结束符为空字符('\0')。
字符常量与字符串常量的区别有如下几点:
①表示形式不同:字符常量用单引号作为定界符,字符串常量用双引号作为定界符。
②字符常量通常可以给字符型变量赋值,而字符串常量通常被存放在一个字符数组中。
③字符串常量要有一个结束符('\0'),而字符常量没有结束符,它只有一个字符。
④运算不同:字符常量除了可以比较外,还可以相减,并可以与整型数进行加减运算。
⑤字符常量输出可使用printf()函数的%c和%d格式符,分别输出字符常量的字符符号和字符的ASCII码值。字符串常量输出则使用printf()函数的%s格式符。
3.字符变量
【例2.6】将小写字母转换为大写。
算法分析:从ASCII码表(参见附录A)中可以看到每一个小写字母的ASCII码值比它相应的大写字母的ASCII码值大32,所以将一个小写字母的ASCII码值减去32,就可以转换为对应的大写字母。
C语言允许字符型数据与整数直接进行算术运算。
程序代码如下:

程序的运行结果为:
A B
说明:程序的作用是将两个小写字母a和b转换为大写字母A和B。'a'的ASCII码值为97,而'A'的ASCII码值为65,'b'的ASCII码值为98,'B'的ASCII码值为66。本例的程序流程图和N-S图如图2-2所示。
思考:若把大写字母转换为对应的小写字母,程序又该如何实现呢?

图2-2 例2.6程序的流程图和N-S图
举一反三:
【例2.7】将一个字符的值加1再输出。
程序代码如下:

程序的运行结果为:
97,98,b,c
说明:程序中定义a和b为字符型变量,并分别存入初始化值为字符'a'和'b',先分别输出字符'a'和'b'所对应的ASCII码值,再将其ASCII码值+1,将变为ASCII码表中对应的下一个字符,再输出。
注意:在0~255范围内,字符型数据与整型数据是通用的。
一个char型变量既能以字符格式输出,也能以整型格式输出,以整型格式输出时就是直接输出该字符对应的ASCII码值。
相关知识2
C语言的字符变量只有一种定义形式:
char变量名;
字符变量用来存放字符常量,一个字符变量只能存放一个字符,如表2-7所示。
表2-7 字符变量类型

每个字符都有一个等价的整型值与其相对应(即ASCII码值),char型数据可以看成一种特殊的整型数。一个int型数据在内存中是以二进制形式存储的,而一个字符在内存中也是以其对应的ASCII码的二进制形式存储的。因此,在C语言中,只要在ASCII码取值范围内,char型数据和int型数据之间的相互转换就不会丢失信息,这也说明char型常量可以参与任何int型数据的运算。
课后讨论
①定义变量时一定要赋初始值吗?不赋初始值的变量一定不能用吗?
注意:定义变量时不一定要赋初始值,但使用时必须赋初值,否则系统会分配一个随机数值。
②字符变量只可以与整型数进行运算吗?
提示:也可以和字符运算,如'c'-'a'值为2。