五、文字处理,字符型及字符串型——char、string
除了进行数值计算,电脑也擅长进行文字信息处理,下面我们介绍字符型数据及字符型变量。
恺撒密码(Caesar cipher)是一种简单且广为人知的加密技术。其明文字母与密文字母对应关系:
加密时,在上表中查找需要加密消息中的每一个明文字母,找出对应的密文字母,在原消息中完成替换。
例如I LOVE YOU 被加密成L ORYH BRX。
例1.3.6加密 某部门需对长度是4个字母的单词进行加密,使用字母替代加密法,加密规则:一个字母用编码(ASCII编码表见附录ASCII码表)位于其后面的第三个字母代替(例如用’D’代替’A’),下面程序输入4个字母的单词,输出加密后的单词。
#include
运行程序,若输入good,则输出是:jrrg
char 字符型 用单引号括起来的一个符号,就是一个字符数据,char可用来定义字符型的变量。英文中的每个符号(字母、数字、标点符号等),都有数值编码,在ASCII(American Standard Code for Information Interchange)码表中有一个对应的8位(即一个字节Byte)二进制编码,见附录B。下面是一些字符的编码:
'A'的编码为“01000001”,对应的十进制数是65、十六进制数是0x41,参见第二章;
'a'的编码为“01100001”,对应的十进制数是97、十六进制数是0x61;
'b'的编码为“01100010”,对应的十进制数是98、十六进制数是0x62;
'0'的编码为“00110000”,对应的十进制数是48、十六进制数是0x30;
' ' 空格的编码为“00100000”,对应的十进制数是32、十六进制数是0x20;
……
变量说明语句“char ch1,ch2,ch3,ch4,c1,c2,c3,c4;”定义了8个字符型变量,每个变量可存放一个字符。执行赋值表达式语句“c1=ch1+3;”时,首先把字符变量ch1存放的字符(ASCII码值)转换成整数类型,然后进行加法运算,再把结果转换成字符类型数据(8位ASCII码值),并赋值给变量c1。类型转换详见第二章第四节。
字符常量(单个字符)要用单引号括起来,例'A'、'6'、'*'。字符串常量(指一个以上的字符)要用双引号括起来,例"Welcome"、 "A"、"^&*!23djkf"。字符'A'占用一个字节的存储空间,字符串"A"占用二个字节的存储空间。注意字符串"2" 、字符'2'和数值2的区别。8个二进制位(bit)构成一个字节(Byte),在机器中,“位”用具有两种稳定物理状态的器件表示。位、字节的详细介绍参见第二章。
对于字符型数据,内部存储为整数(即ASCII编码),外部表现为文字符号。查ASCII码表(附录B)可以知道某字符的ASCII码值,也可用下面程序求出字符的ASCII码值。
例1.3.7编写程序,输入一个字符,输出它的ASCII码值。
运行程序,若输入A,则输出为65
字符型数据的+运算,实际上是它的ASCII码值的+运算。字符型数据可以进行比较(>=, <,!=等)运算。例如’A’>’B’的值是假0,’a’>’B’的值是真1。
使用cin输入命令时,以空格键、跳格键Tab、回车键Enter作为输入对象的分隔符,所以,要输入“空格”字符本身,要使用scanf("%c",&ch);命令。
string类型 c++提供了字符串类型(c语言没有此类型,它是c++通过类的定义机制扩展的,是c++标准库类型),在程序开头增加“#include <string>”指令,即可使用string类型变量及相应的运算(函数)。
例1.3.8向某人问好。
运行程序,输入:
Zhao Fengping
输出为:
Hello, Zhao Fengping!
使用cin输入命令,会略过空白符(指空格、Tab、回车符Enter),然后读入数据到变量中,直到遇见下一个空白符或变量已装满为止,故例1.3.7要使用“scanf("%c",&ch);”,程序运行时才能输入空格符' '
再测试运行例1.3.8程序,按1次回车键、空格键及(或)Tab键,再输入Zhao,然后按1次回车键及空格键或Tab键,再输入Fengping,最后按回车键。输出结果是否和原来的一样?
输入整行字符串(含空格,以回车符Enter结束)到字符串变量s,使用“getline(cin,s);”命令。
把例1.3.8程序的第7、8行删去,换成“getline(cin,name);”命令,以下面几种输入方式测试程序:
1. Zhao Fengping
2. 按1次回车键……,然后(就没有然后了)按空格键及(或)Tab键,再输入Zhao,……
3. 按3次空格键,再输入Zhao,按空格、Tab键、按回车键……
再测试运行例1.3.3程序,在输入的3个数据2、3、1之前或中间按任意次数的空白符(指空格、Tab、回车符Enter),输入数值1之后的回车表示输入结束。结果输出与原来一样。cin是如何“吃进”数据的?
例1.3.8表明,string类型的字符串可以进行赋值(=)及连接运算(+);对于连接运算+,+号两边的运算对象有一个必须是string类型的字符串变量。例如 "abc"+"xy"或"abc"+'!'是错误的用法。
字符串也可以进行比较运算,字符串比较原理:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符 或其中之一已结束……。字符串的更多操作是通过string库函数实现的。
字符串的比较操作:
string s,t; s="as"; t="AS";
cout<<(s<=t)<<endl; //a的ASCII码是97,A的ASCII码是65,结果是0
s="as";t="asd";
cout<<(s<t)<<endl; //结果是1
s="^&*%";t="^&%$@"; //*的ASCII码是42 %的ASCII码是37
cout<<(s<t)<<endl; //结果是0
访问字符串的单个字符 字符串是一个整体,但是也可以存取(访问)字符串中指定的第几个字符 。
char ch; int k; string s="abcde"; //定义变量s,同时设置初值为"abcde"
s[1]= 'A'; //存 字符串s的第二个字符设置成字符'A'
cout<<s[0]<<s<<endl; //取 输出s的第一个字符及s,即:aaAcde
ch=s[2]; //取 取字符串s的第三个字符'c'存入字符变量ch
k=2; cout<< s[k]<<endl; //取 输出字符串s的第k+1(3)个字符
cout<< s[1+2]<<endl; //取 思考:输出字符串s的几个字符?输出是什么?
k=3; cout<< s[k-1]<<endl; //取 思考:输出字符串s的第几个字符?输出是什么?
用函数size()或length()求出字符串长度,可以知道字符串s中有几个字符。
string s="abcde"; int len; //定义变量s,同时设置初值为"abcde"
cout<< s.size()<<endl; //显示字符串s的长度。s.size()即字符串s的长度,此处输出5
len= s.size();
cout<< s[len-1]<<endl; //输出字符串s的最后一个字符。
cout<< s[s.size()/2]<<endl; //思考:输出字符串s的哪一个字符?
下一篇 7.逻辑判断及逻辑运算,布尔型——bool