算法竞赛宝典(第一部):语言及算法入门
上QQ阅读APP看书,第一时间看更新

字符和字符串

字符变量包括字符型变量和字符串变量。

字符变量是用单撇号括起来的一个字符,如'a','x','?','$'等。

字符串变量是一对双撇号括起来的字符序列。如"Good Morning! ","a ","$34567"都是字符串变量。例如输出一个字符串如下:

    cout<<"How do you do!";

明白了,字符变量只能有一个字符,是用单撇号括起来的。字符串变量可以有许多字符,是用双撇号括起来的。如'a'是一个字符变量,"a"是一个字符串变量。不能将字符常量与字符串常量混淆。可是'a'和"a"真正的区别在哪里呢?

每一个字符串的结尾有一个“字符串结束标志”,以便系统据此判断字符串是否结束。C++语言规定以字符'\0'作为字符串结束的标志,'\0'是一个ASCII码为0的字符,占一个字节。例如有一个字符串“Hello”,实际在内存中存储如图1.20所示。

图1.20

它占的内存不是5个字节,而是6个字节,最后一个字节为'\0'。但在输出时不输出'\0'。

又如,char a[]="abcd";cout<<sizeof(a);结果为5,因为有结束符'\0'。

在写字符串时不必加'\0',否则会画蛇添足。'\0'是系统自动加上的。字符串"a"实际包含2个字符:'a'和'\0',因此,把它赋给只能容纳一个字符的字符变量c="a"显然是不行的。如char a="a"是错误的。

字符变量是用来存放字符常量,请注意只能放一个字符。

字符变量的定义形式如下:

    char c1,c2;

它表示c1和c2为字符型变量,各可以放一个字符,因此可以用下面语句对c1、c2赋值:

    c1='a';c2='b';

字符数据在内存中实际是以该字符相对应的ASCII码存储,它的存储形式与整数的存储形式类似。这样使得字符型数据和整型数据可以通用。一个字符数据既可以以字符形式输出,也可以以整数形式输出,还可以对它们进行算术运算。

ASCII码表请参见本书的附录部分。表1.4中列出了几个常用的码表值:

表1.4

下面的代码显示了字符变量与整数之间的通用性:

1 //字符变量与整数的通用性演示
2 # include <iostream>
3 using namespace std;
4 int main()
5 {
6  char c1,c2;
7  c1=65;                  //注意此处是数字
8  c2=66; //注意此处是数字
9  cout<<c1<<" "<<c2<<endl; //因为c1,c2为字符类型,所以输出也是字符
10  cout<<int(c1)<<" "<<int(c2)<<endl; //此处强制转化为数字输出
11  system("pause");
12  return 0;
13 }

显示结果如图1.21所示。

图1.21

下例程序是大小写字母的转换。

1 //大小写字母转换
2 #include <iostream>
3 using namespace std;
4 
5 int main()
6 {
7  char c1,c2;
8  c1='a';
9  c2='b';
10  c1=c1-32;
11  c2=c2-32;
12  cout<<c1<<' '<<c2<<endl;
13  system("pause");
14  return 0;
15 }

运行结果为

A B

从ASCII码表中我们可以看到,每一个小写字母比它相应的大写字母的ASCII码大32。C++语言允许字符数据与整数直接进行算术运算。这种处理方法增大了程序的自由度。例如,对字符做各种转换就比较方便。

【例题描述】 恺撒加密术

古罗马时期,《高卢战记》有描述恺撒曾经使用密码来传递信息,即所谓的“恺撒加密术”,它是一种替代密码,如图1.22所示,对于信件中的每个字母,会用它后面的第t个字母代替。例如当t=4时,“China”加密的规则是用原来字母后面第4个字母代替原来的字母,即字母“A”后面第4个字母是“E”,用“E”代替“A”。因此,“China”应译为“Glmre”。请编写一程序可将任意5个字符加密。

图1.22

1 //恺撒加密术
2 #include <iostream>
3 using namespace std;
4 
5 int main()
6 {
7  char c1='C',c2='h',c3='i',c4='n',c5='a';
8  c1+=4;      //即c1=c1+4;
9  c2+=4;
10  c3+=4;
11  c4+=4;
12  c5+=4;
13  cout<<c1<<c2<<c3<<c4<<c5<<endl;
14  system("pause");
15  return 0;
16 }

【上机实践】 改进的加密术

请编写一个程序,在程序运行时输入任意5个字符,再输入任意一个值t(-8<t<8),则原先的5个字符将用其后面第t个字母代替并输出。

伪代码为

1 定义5个字符变量
2 定义t值
3 输入5个字符变量的值
4 输入t值
5 5个字符以其后面第t个字母代替
6 输出5个字符

C++还允许一种特殊形式的字符常量,就是以一个“\”开头的字符序列。例如前面我们已经用过的'\n',它代表一个“换行”符。这是一种“控制字符”,是不能在屏幕上显示的。在程序中也无法用一个一般形式的字符表示,只能采用特殊形式来表示。

表1.5所示是以'\'开头的特殊字符(转义字符)。

表1.5

通过转义字符,我们就可以在屏幕上输出诸如'\',''','"'之类的字符了。

注意,转义字符变量必须用单撇号括起来,不可用双撇号。双撇号用于字符串。

【上机实践】 输出特殊字符

请在屏幕上输出如图1.23所示的字符串,注:所有字符均为英文半角。

图1.23