字元序列
您可能已經知道,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;
|