字符序列

您可能已经知道,C++标准库实现了一个强大的 string 类,它对于处理和操作字符串非常有用。但是,因为字符串实际上是字符序列,我们也可以将它们表示为普通的字符数组。char元素。

例如,以下数组

1
char jenny [20];

是一个可以存储最多 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类型的元素数组还有另一种初始化其值的方法:使用字符串字面量。

在我们之前章节的一些示例中使用的表达式中,代表整个字符串的常量已经多次出现。这些是通过将要成为字符串字面量的文本括在双引号 (") 之间来指定的。例如

1
"the result is: "

是一个我们可能已经使用过的常量字符串字面量。

双引号字符串 (") 是字面常量,其类型实际上是空终止的字符数组。因此,用双引号括起来的字符串字面量总是会在末尾自动附加一个空字符 ('\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类型的元素数组。前两个使用字符串字面量常量初始化,而第三个保持未初始化。在任何情况下,我们都必须指定数组的大小:在前两个 (questiongreeting) 中,大小由它们初始化为的字面常量长度隐式定义。而对于yourname,我们明确指定它的大小为 80 个字符。

最后,存储在char数组中的字符序列可以很容易地转换为string对象,只需使用赋值运算符即可。

1
2
3
string mystring;
char myntcs[]="some text";
mystring = myntcs;
Index
目录