字符序列
您可能已经知道,C++标准库实现了一个强大的
string 类,它对于处理和操作字符串非常有用。但是,因为字符串实际上是字符序列,我们也可以将它们表示为普通的字符数组。
char元素。
例如,以下数组
是一个可以存储最多 20 个
char类型的元素的数组。它可以表示为
因此,理论上,在这个数组中,我们可以存储长度最多为 20 个字符的字符序列。但我们也可以存储更短的序列。例如,
jenny在程序的某个时刻可以存储序列
"Hello"或序列
"Merry christmas",因为它们都短于 20 个字符。
因此,由于字符数组可以存储比其总长度更短的序列,因此使用一个特殊的字符来表示有效序列的结尾:
空字符,其字面常量可以写为
'\0'(反斜杠,零)。
我们的 20 个
char类型的元素数组,称为
jenny,可以表示为存储字符序列
"Hello"和
"Merry Christmas"为
请注意,在有效内容之后,包含了一个空字符 (
'\0') 以指示序列的结尾。灰色面板表示具有不确定值的
char元素。
空终止字符序列的初始化
由于字符数组是普通数组,它们遵循所有相同的规则。例如,如果我们想用一些预定的字符序列初始化一个字符数组,我们可以像其他任何数组一样进行操作
1
|
char myword[] = { 'H', 'e', 'l', 'l', 'o', '\0' };
|
在这种情况下,我们将声明一个包含 6 个
char类型的元素的数组,并使用构成单词的字符进行初始化
"Hello"加上一个空字符
'\0'在结尾。
但是,
char类型的元素数组还有另一种初始化其值的方法:使用字符串字面量。
在我们之前章节的一些示例中使用的表达式中,代表整个字符串的常量已经多次出现。这些是通过将要成为字符串字面量的文本括在双引号 (") 之间来指定的。例如
是一个我们可能已经使用过的常量字符串字面量。
双引号字符串 (
") 是字面常量,其类型实际上是空终止的字符数组。因此,用双引号括起来的字符串字面量总是会在末尾自动附加一个空字符 (
'\0')。
因此,我们可以用以下两种方法之一初始化
char类型的元素数组,称为
myword,使其成为空终止的字符序列
1 2
|
char myword [] = { 'H', 'e', 'l', 'l', 'o', '\0' };
char myword [] = "Hello";
|
在这两种情况下,字符数组
myword都被声明为具有 6 个
char类型的元素的大小:构成单词的 5 个字符
"Hello"加上一个最终的空字符 (
'\0'),它指定序列的结尾,并且在第二种情况下,当使用双引号 (
") 时,它会自动附加。
请注意,我们讨论的是在声明字符数组时初始化它,而不是在声明之后为其赋值。事实上,因为这种类型的空终止字符数组是常规数组,所以我们有与任何其他数组相同的限制,因此我们无法使用赋值操作复制数据块。
假设
mystext是一个
char[]变量,源代码中的表达式,如
1 2
|
mystext = "Hello";
mystext[] = "Hello";
|
将是
无效的,就像
1
|
mystext = { 'H', 'e', 'l', 'l', 'o', '\0' };
|
一样。一旦您对指针有更多的了解,这样做的原因可能会变得更容易理解,因为那时将阐明数组实际上是指向内存块的常量指针。
使用空终止的字符序列
空终止的字符序列是 C++ 中处理字符串的自然方式,因此它们可以在许多过程中用作字符串。事实上,常规字符串字面量具有这种类型 (
char[]) 并且也可以在大多数情况下使用。
例如,
cin和
、cout支持将空终止序列作为字符序列的有效容器,因此它们可以直接用于从
cin提取字符串或将它们插入到
、cout中。例如
|
// null-terminated sequences of characters
#include <iostream>
using namespace std;
int main ()
{
char question[] = "Please, enter your first name: ";
char greeting[] = "Hello, ";
char yourname [80];
cout << question;
cin >> yourname;
cout << greeting << yourname << "!";
return 0;
}
|
Please, enter your first name: John
Hello, John! |
正如您所看到的,我们声明了三个
char类型的元素数组。前两个使用字符串字面量常量初始化,而第三个保持未初始化。在任何情况下,我们都必须指定数组的大小:在前两个 (
question和
greeting) 中,大小由它们初始化为的字面常量长度隐式定义。而对于
yourname,我们明确指定它的大小为 80 个字符。
最后,存储在
char数组中的字符序列可以很容易地转换为
string对象,只需使用赋值运算符即可。
1 2 3
|
string mystring;
char myntcs[]="some text";
mystring = myntcs;
|