温故而知新。
C++语言中的字符串有两种形式:一种就是用字符数组表示字符串,一种就是用标准库中string来定义字符串。
这节主要讲述C语言中字符数组的用法。
一 字符常量
1.1 普通的字符常量
用单撇号括起来的一个字符就是字符常量。如'a','#','%','D'.
注意:
- 字符常量只包括一个字符
- 字符常量区分大小写字母
- 撇号是定界符,而不属于字符串常量的一部分
1.2 转义字符常量
是一种特殊形式的字符常量,就是以'\'开头的字符序列。
常见的"\"开头的特殊字符见下表:
之所以称为转义字符,意思是将反斜杠(\)后面的字符转换成另外的意义。
转义字符虽然包含两个或多个字符,但它只代表一个字符。编译系统在见到字符"\"时,会接着找它后面的字符,把它处理成一个字符,在内存中只占一个字节。
1.3 字符数据的存储形式
将一个字符常量存放到内存单元时,实际上并不是把该字符本身放到内存单元中去,而是将该字符相应的ASCII代码放到存储单元中。
既然字符数据以ASCII码存储的,它的存储形式就与整形的存储形式类似。这样C++中字符型数据和整形数据就可以通用。一个字符数据可以赋值给一个整形变量,一个整形数据也可以赋值给一个字符变量。也可以对字符数据进行算术运算,此时相当于对它们的ASCII码进行算术运算。
注意:字符数据只占一个字节,它只能存放0-255范围内的整数。
#include<iostream>
using namespace std;
int main()
{
char c1,c2;
c1='a';
c2='b';
c1=c1-32;
c2=c2-32;
cout<<c1<<' '<<c2<<endl;
return 0;
}
执行结果:
A B
1.4 字符串常量
用双撇号括起来的字符就是字符串常量,如"abc","hello!"。
编译系统会在字符串最后自动加一个"\0"作为字符串结束标志。但"\0"并不是字符串的一部分,他只是作为字符串的结束标志。
注意:"a"和'a'代表不同的含义,"a"是字符串常量,'a'是字符常量。前者占两个字节,后者占1个字节。
二 字符数组
1.1 定义和 初始化字符数组
(1)先定义再初始化
char c[6];
c[0] = 'H';
c[1] = 'e';
c[2] = 'l';
c[3] = 'l';
c[4] = 'o';
(2)定义时初始化
char c[6] = { 'H','e','l','l','o'};
或者直接用字符串常量初始化字符数组。这种方法更加直观,方便,符合人们的习惯。
char c[6] = "Hello";
又或者省略字符串的长度,系统会根据初值的个数确定数组长度。
char c[] = "Hello";
也可以初始化一个二维字符数组,如
char diamond[5][5] = { {' ',' ','*'},{' ','*',' ','*'},{'*',' ',' ',' ','*'},
{ ' ','*',' ','*' },{' ',' ','*'} };
1.2 赋值和引用
只能对字符数组的元素赋值,而不能用赋值语句对整个数组赋值。如:
char c[5];
c = { 'H','e','l','l','o' }; //错误
c[0] = 'H';c[1] = 'e';c[2] = 'l';c[3] = 'l';c[4] = 'o'; //正确
如果已经定义了a和b是具有相同类型和长度的数组,且b数组已经被初始化,则:
a = b; //错误,不能对整个数组整体赋值
a[0] = b[0]; //正确,引用数组元素
1.3 字符串结束标志
C++规定了一个"字符串结束标志",以字符'\0'代表。
遇到字符'\0'就表示字符串到此结束,由它前面的字符组成有效字符串。
在程序中往往依靠检测'\0'的位置来判定字符串是否结束,而不是根据数组的长度决定字符串的长度。
需要说明的是:字符数组并不要求它的最后一个字符必须是'\0',甚至可以不包含'\0'。
char str[5] = { 'C','h','i','n','a' };
是否需要加'\0',完全根据程序的需要决定。
1.4 字符数组的输入输出
有两种方法:
(1)逐个字符输入输出;
(2)将整个字符串一次输入或输出。
例如:
char str[20];
cin >> str;
cout << str;
注意:
(1)输出的字符不包括结束符'\0'
(2)输出字符串时,cout流中用字符数组名,而不是数组元素名。如:
cout << str;
cout << str[4];
(3)如果数组长度大于字符串实际长度,输出遇'\0'结束。
(4)如果一个字符数组包含一个及其以上'\0',则遇第一个'\0'时输出结束。
(5)用cin从键盘向计算机输入一个字符串时,从键盘输入的字符应短于已定义的字符数组的长度。
C++提供cin流中的getline函数,用于读入一行字符。
1.5 字符串处理函数
(1)字符串连接函数
strcat(char[], const char[]);
作用:将第2个字符数组中的字符串连接到前面字符数组的字符串的后面。
第二个字符数组被声明为const,以保证内容不会被修改。
(2)字符串复制函数
strcpy(char[], const char[]);
作用:将第2个字符数组中的字符串复制到第1个字符数组中去。
说明:
a. 在调用strcpy函数时,第一个实参必须是数组名,第二个实参可以是字符数组名,也可以是一个字符串常量。如
strcpy(str1,"China");
b. 可以用strcpy函数将一个字符串前若干字符复制到一个字符数组中去。
strcpy(str1,str2,2); //仅复制前两个字符
c. 只能通过调用strcpy函数来实现将一个字符串赋给一个字符数组,而不能用赋值语句将一个字符串常量或字符数组直接赋值给一个字符数组。
str1 = "China"; //错
str1 = str2; //错
(3)字符串比较函数
strcmp(const char[], const char[]);
作用:比较两个字符串。
a. 如果字符串1等于字符串2,函数值为0。
b. 如果字符串1大于字符串2, 函数值为一正整数。
c. 如果字符串1小于字符串2,函数值为一负整数。
对两个字符串自左至右逐个字符相比,直到遇到不同的字符。
1.6 字符串长度函数
strlen(const char[]);
函数值为字符串的实际长度,不包括'\0'在内。