4.1.4 字符数组和字符串处理
char类型的数组被称作字符数组,通常用来存储字符串。字符串是附加有特殊字符(串尾标志)的字符序列。串终止字符表明字符串已经结束,该字符由转义序列'\0'定义,有时被称为空字符,占用一个字节,其中8位全为0。这种形式的字符串经常被称作C型字符串,因为以这样的方式定义字符串是在C语言中推出的,后来Bjarne Stroustrup以C语言为基础开发出了C++(www.cppentry.com)。这不是唯一能用的字符串表示法,本书稍后将介绍其他表示方法。特别需要指出的是,C++(www.cppentry.com)/CLI程序使用一种不同的字符串表示法,而MFC定义了表示字符串的CString类。
C型字符串在内存中的表示如图4-2所示。
|
| (点击查看大图)图 4-2 |
图4-2说明了内存中字符的表示形式,同时给出一种我们即将讨论的的字符串声明形式。
注意:
字符串中每个字符占用一个字节,因此算上最后的空字符,字符串需要的字节数要比包含的字符数多一个。
我们可以用字符串字面值来声明并初始化字符数组。例如:
- char movie_star[15] = "Marilyn Monroe";
注意,终止字符'\0'是编译器自动添加的。如果在该字面值中显式添加'\0',则最终将得到两个空字符。但是,我们给字符数组指定元素数量时必须考虑到终止字符的存在。
如图4-1所示,我们可以让编译器来算出已初始化的数组的长度。下面是另一个示例:
- char president[] = "Ulysses Grant";
因为长度没有指定,所以编译器将分配足够的内存空间来容纳该初始化字符串及终止字符。在本例中,编译器将给数组president分配14个元素。当然,如果希望稍后使用该数组来存储另一个字符串,则其长度(包括终止空字符)不能超过14个字节。通常,确保数组足以存储随后希望存储的任何字符串是编程(www.cppentry.com)人员的职责。
我们也可以创建由Unicode字符组成的字符串,字符串中的字符类型为wchar_t。下面是一个创建Unicode字符串的语句:
- wchar_t president[] = L"Ulysses Grant";
前缀L表示字符串字面值是一个宽字符串,因此字符串中的每个字符(包括终止空字符)都会占两个字节。当然,对字符串的索引会引用字符,而不是字节,因此president[2]对应于字符L'y'。
1. 字符串输入
<iostream>头文件包含许多从键盘上读取字符的函数定义。下面将看到的是getline()函数,该函数读取从键盘输入的字符序列,并将其以字符串形式(以'\0'字符终止)存入字符数组中。我们通常像下面这样使用getline()函数:
- const int MAX = 80;
// Maximum string length including \0 - char name[MAX]; // Array to store a string
- cin.getline(name, MAX, '\n');
// Read input line as a string
这些语句首先声明一个有MAX个元素的char型数组name,然后使用getline()函数从cin中读取字符。如上所示,数据源cin与函数名称之间有一个句点。句点表示我们在调用的getline()函数属于cin对象之一。getline()函数中各参数的意义在图4-3中给出。
|
| (点击查看大图)图 4-3 |
因为getline()函数的最后一个参数是'\n'(换行符或行结束字符),而第二个参数是MAX,所以如果读到'\n'字符,或者已经读入MAX-1个字符,则无论哪种情况先发生,都停止从cin读取字符。可读取的最大数量是MAX-1而不是MAX,因为数组中存储的字符序列要附加'\0'字符。在键盘上按Return键将产生'\n'字符,因此它通常是最方便的使输入终止的字符。当然,我们可以通过改变最后一个参数而指定其他字符。输入数组name中不存储'\n'字符,但前面曾经说过,'\0'字符将附加到数组中输入字符串的尾部。
稍后讨论类时,我们将学习更多与这种语法形式有关的知识。在此期间,我们只需视之为理所当然,并在示例中使用它即可。
试一试:编程(www.cppentry.com)处理字符串
现在,我们已经有足够的知识来编写一个读取字符串并计算其中包含多少字符的简单程序。
- // Ex4_03.cpp
- // Counting string characters
- #include <iostream>
- using std::cin;
- using std::cout;
- using std::endl;
-
- int main()
- {
- const int MAX = 80; // Maximum array dimension
- char buffer[MAX]; // Input buffer
- int count = 0; // Character count
-
- cout << "Enter a string of less than 80 characters:\n";
- cin.getline(buffer, MAX, '\n');
// Read a string until \n -
- while(buffer[count] != '\0') // Increment count as long as
- count++; // the current character is not null
-
- cout << endl
- << "The string \"" << buffer
- << "\" has " << count << " characters.";
- cout << endl;
- return 0;
- }
该程序的典型输出如下所示:
- Enter a string of less than 80 characters:
- Radiation fades your genes
- The string "Radiation fades your genes" has 26 characters.
示例说明
该程序首先声明一个字符数组buffer,然后显示一条提示用户输入的消息,之后将从键盘输入的字符串读入到buffer数组中。当用户按下Return键,或者已经读入MAX-1个字符时,则结束从键盘读取字符的操作。
while循环用来计算输入字符的个数。只要buffer[count]引用的当前字符不是'\0',该循环就继续执行。像这样一边在数组中逐步前进,一边检查当前的字符,是本地C++(www.cppentry.com)程序中常见的一种技术。该循环中的唯一动作是每看到一个非空字符,就使count加1。
注意:
库函数strlen()的功能和该循环的功能相同,这个函数将在本章后面介绍。
在示例的最后,我们用一条输出语句来显示输入的字符串和字符数量。注意,使用转义字符'\"'是为了输出双引号。