Home C&C++函数库 c++ 语法 程序源码 Linux C库

字符数组


在前面的章节中已经简要介绍了字符串类。它是一个处理和操作字符串的非常强大的类。 但是,因为字符串实际上是字符序列,所以我们也可以将它们表示为字符类型元素的普通数组。

例如,下面的数组:

char foo [20];

是一个最多可以存储20个char类型元素的数组。可以表示为:

因此,这个数组最多可以存储20个字符的序列。但是这个容量不需要完全耗尽:数组也可以容纳较短的序列。 例如,序列“Hello”或序列“Merry Christmas”都可以存储在foo中, 因为它们都可以存储在一个容量为20个字符的序列中。

按照约定,字符序列中表示的字符串的结束由一个特殊字符表示:null字符, 其字面值可以写成'\0'(反斜杠,0)。

在本例中,由20个char类型元素组成的数组称为foo,可以将字符序列"Hello"和"Merry Christmas"表示为:


请注意,在字符串本身的内容之后,如何添加一个空字符('\0'),以指示序列的结束。灰色面板表示未确定值的char元素。

☞ 字符数组的初始化



因为字符数组是普通数组,所以它们遵循数组的规则。 例如,要用预先确定的字符序列初始化一个字符数组,可以像其他数组一样:

char myword[] = { 'H', 'e', 'l', 'l', 'o', '\0' };

上面声明了一个由6个char类型的元素组成的数组,初始化的字符是组成单词“Hello”的字符加上末尾的空字符“\0”。

但是字符数组还有另一种初始化方法:直接使用字符串字面值。

在前几章的一些例子中使用的表达式中,字符串字面量已经出现了好几次。通过将文本括在双引号(")之间来指定。例如:

"the result is: "

这是一个字符串字面值,可能在前面的一些示例中使用过。

双引号(")括起来的字符序列是文字常量。它们的类型实际上是一个以空结束的字符数组。这意味着字符串字面值总是在末尾自动附加一个空字符('\0')。

因此,名为myword的字符数组可以通过以下两种语句中的任意一种进行初始化:

char myword[] = { 'H', 'e', 'l', 'l', 'o', '\0' };
char myword[] = "Hello";

在这两种情况下,第一种声明一个char类型的6个元素大小的字符数组myword:5字符组成“Hello”这个词, 加上最后一个null字符(\ 0),它指定序列的末尾,在第二种情况下,当使用双引号(")的时候,null字符是自动添加的。

请注意,这里我们讨论的是在字符数组被声明时对其进行初始化,而不是在之后 (一旦它们已经被声明)对它们赋值。实际上,因为字符串字面值是常规数组, 所以它们有相同的限制,不能被赋值。

下面的表达式(myword已经在前面声明),如:

myword = "Bye";
myword[] = "Bye";

都不是有效的.都不会是:

myword = { 'B', 'y', 'e', '\0' };

这是因为不能给数组赋值。但是请注意,它的每个元素都可以单独分配一个值。例如,这是正确的:

myword[0] = 'B';
myword[1] = 'y';
myword[2] = 'e';
myword[3] = '\0';

☞ 字符串和字符数组


字符数组是C语言中用来表示字符串的典型类型(这就是为什么它们也被称为C风格字符串C-strings)。 在c++中,尽管标准库为字符串定义了特定的类型(string类),但是,字符数组(C-string)仍然是C++语言中表示字符串的自然方式; 事实上,字符串字面量总是作为字符数组,而不是字符串对象使用。

在标准库中,字符串的两种表示形式(字符数组和标准库字符串)并存,并且大多数需要字符串的函数都重载以同时支持这两种形式。

例如,cin和cout直接支持以空结尾的序列,允许它们直接从cin中提取或插入到cout中,就像字符串一样。例如:

// strings and NTCS:
#include <iostream>
#include <string>
using namespace std;

int main ()
{
  char question1[] = "What is your name? ";
  string question2 = "Where do you live? ";
  char answer1 [80];
  string answer2;
  cout << question1;
  cin >> answer1;
  cout << question2;
  cin >> answer2;
  cout << "Hello, " << answer1;
  cout << " from " << answer2 << "!\n";
  return 0;
}
What is your name? Homer
Where do you live? Greece
Hello, Homer from Greece!

在本例中,使用了字符数组和字符串。它们与cin和cout一起使用时是可以互换的, 但它们声明的时候有一个显著的不同:数组有固定的大小,声明时需要隐式或显式指定; Question1的长度正好是20个字符(包括结束的空字符),answer1的长度是80个字符; 然而字符串只是普通字符串,没有指定大小.这是因为字符串的动态大小是在运行时确定的, 而数组的大小是在程序运行之前编译时确定的。

在任何情况下,字符数组和字符串都可以轻易地相互转换:

字符数组可以隐式转换为字符串,字符串可以通过使用string的成员函数c_str或data转换为字符数组:

char myntcs[] = "some text";
string mystring = myntcs;  // convert c-string to string
cout << mystring;          // printed as a library string
cout << mystring.c_str();  // printed as a c-string 
(注意:c_str和string的data成员是等价的)
联系我们 免责声明 关于CandCplus 网站地图