NOIP学习小站
西安交通大学附属中学航天学校

char字符类型

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表,会发现字符与整数对应关系有以下特点:

  1. 大写字母'A'与十进制数65对应,更普遍地,大写字母'A'~'Z'与十进制数65~90连续一一对应
  2. 小写字母'a'与十进制数97对应,更普遍地,大写字母'a'~'z'与十进制数97~122连续一一对应
  3. 数字字符'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是第一个字母,编写程序求出:

    1. Q是字母表的第几个字母?
    2. 第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'对应的整数也是连续的,并且小写字母对应的整数大于大写字母。

    通过上表分析可知小写字母比对应大写字母大32(也就是'a'-'A'
    #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;
    }