char类型不仅仅可以存储-128~127范围内的整数,更普遍的用法是存储一个字符。
一、字符串、字符、ASCII表
前面我们输出"Hello World"
,称"Hello World"
是一句话,或者是一段文本,更专业的称谓是字符串。字符串就是有顺序的若干符号“串”在一起组成的文本,字符串中的每个符号就是字符。字符串"Hello World"
中的字符依次是'H'
、'e'
、'l'
、'l'
、'o'
、' '
(空格)、'W'
、'o'
、'r'
、'l'
、'd'
。字符的书写方法是用英文单引号将符号括起来。
char类型不仅仅可以存储-128~127范围内的整数,更普遍的用法是存储一个字符,包括大小写英文字母、数字符号和英文标点符号以及一些特殊意义的字符(不包括任何汉字),这些字符和0~127的整数一一对应。
这个表展示了字符与十进制数一一对应的关系,称之为ASCII表(American Standard Code for Information Interchange,美国信息交换标准代码)。第0个到第31个字符(也是十进制数0~31对应的字符)是控制字符(不可见字符),从第32个字符开始,每个整数对应一个打印字符(英文标点符号、数字、大小写字母等)。
仔细分析ASCII表,会发现字符与整数对应关系有以下特点:
- 大写字母
'A'
与十进制数65对应,更普遍地,大写字母'A'
~'Z'
与十进制数65~90连续一一对应 - 小写字母
'a'
与十进制数97对应,更普遍地,大写字母'a'
~'z'
与十进制数97~122连续一一对应 - 数字字符
'0'
与十进制数48对应,更普遍地,数字字符'0'
~'9'
与十进制数48~57连续一一对应。需要注意的数字字符'0'
与整数0不同,'0'
是字符,0是int整数。例如字符串"result is 0"
,最后一个字符是数字字符'0'
。
现在应该清楚'A'
、"A"
、A
的区别了吧?'A'
是字符,"A"
是只包含一个字符的字符串、A
可以理解为变量。
同样的,'1'
是字符,"1"
是只包含一个字符的字符串、1
是整数常量。
二、char字符的本质——char字符与整数的关系
char类型的本质就是一个-128~127范围的整数,只不过char类型0~127范围内的整数与ASCII表中的字符一一对应。正是这个特点,char字符与0~127范围内的整数可以混合使用(相互赋值),甚至相互运算。参见下面测试程序:
#include<iostream> using namespace std; int main() { char ch1 = 'a'; char ch2 = 'b'; cout<<ch1<<" "<<ch2<<endl; cout<<ch2-ch1<<endl; //两个char运算,实际是对应的整数参加运算 return 0; }
#include<iostream> using namespace std; int main() { //int整数65赋值给char变量ch,赋值后变量ch就是十进制数65对应的字符'A' char ch = 65; cout<<ch<<endl; //ch是字符'A',但是输出时只会输出A,单引号不会输出 //char+int,类型自动转换后结果是int,char变量ch对应十进制数65参加计算,输出66 cout<<ch+1<<endl; //先计算ch+1,结果是66,赋值给char变量ch,ch变成十进制数66对应的字符'B' ch = ch+1; cout<<ch<<endl; //输出B return 0; }
#include<iostream> using namespace std; int main() { //char字符'A'赋值给int变量,赋值后变量n就是字符'A'对应的十进制数65 int n = 'A'; cout<<n<<endl; //输出65 cout<<(char)n<<endl; //输出A(将int强制转换成char) //char-int,类型自动转换后结果是int,'a'对应十进制数97参加计算,输出32 cout<<'a'-n<<endl; n = n+1; cout<<(char)n<<endl; //输出B return 0; }
三、char数据程序示例
例1:英文字母。大家知道有26个英文字母,其中A是第一个字母,编写程序求出:
- Q是字母表的第几个字母?
- 第20个字母是哪一个?
思路:char字符'A'
~'Z'
对应的整数是连续的,而且char类型的变量支持与整数直接进行数学计算。
#include<iostream> using namespace std; int main() { //'A'是第1个字母,'Q'应该是第('Q'-'A'+1)个字母 int ans1 = 'Q'-'A'+1; //第n个字母是'A'+n-1,赋值给char类型变量 char ans2 = 'A'+20-1; cout<<ans1<<endl<<ans2<<endl; return 0; }
例2:将输入的大写字母转换成对应的小写字母。
- 输入格式:1个大写字母(竞赛编程时,不需要考虑运行时输入不满足题目输入格式的情况,例如这里不需要考虑万一输入的字符不是大写字母这样的情况;当然,如果是编写实用软件,那就需要考虑这些情况,例如发现输入的字符不是大写字母时给出错误提示)
- 输出格式:1个字符,也就是输入的大写字母对应的小写字母
思路:大写字母'A'
~'Z'
对应的整数是连续的,小写字母'a'
~'z'
对应的整数也是连续的,并且小写字母对应的整数大于大写字母。
#include<iostream> using namespace std; int main() { char ch1,ch2; cin>>ch1; ch2 = ch1+'a'-'A'; cout<<ch2<<endl; return 0; }
#include<iostream> using namespace std; int main() { char ch1,ch2; ch1 = getchar(); ch2 = ch1+'a'-'A'; cout<<ch2<<endl; return 0; }
除了使用cin输入char字符外,还可以通过getchar()函数输入char字符赋值给char变量。
试一试:编写程序将输入的小写字母转换成对应的大写字母。
例3:使用转义字符'\n'
实现换行效果。
观察ASCII表,会发现有一些特殊的转义字符,例如'\n'
、'\r'
、'\t'
等。转义字符特殊的原因是书写的时候“明明”是两个符号(以\
开头再加另外一个符号),其实却是一个字符。如果要表示字符\
,需要使用'\\'
。其中常用的'\n'
是换行符,'\t'
是制表符,通过一段程序来测试'\n'
的用途:
#include<iostream> using namespace std; int main() { //字符串"Hello\nWorld\n"中出现了两次换行符'\n' cout<<"Hello\nWorld\n"; //字符串"\n"中有且仅有一个字符——换行符'\n' cout<<123<<"\n"<<456<<endl; //直接输出换行符'\n' cout<<123<<'\n'<<456<<endl; return 0; }
程序运行结果如下:
Hello World 123 456 123 456
可知不管是单个'\n'
还是字符串中有字符'\n'
,输出时'\n'
都会产生换行的效果。
试一试:编写并运行下面程序,观察运行效果(确保可以听到计算机发出的声音):
#include<iostream> using namespace std; int main() { cout<<"Listen...\a"; //输出字符'\a'会发出声音 return 0; }