**************************************************************
原文連結:http://www.cplusplus.com/doc/tutorial/
**********************************************
就像你可能已經知道了的那樣,在C++標準庫中實現了一個功能強大的
string(字串)類,它對控制和操作有字元組成的字串非常有用。但是,因為字串實際上是字元序列,我們也可以用普通的
char型數組來保釋它們。
Your Ad Here
例如下面的數組:
是一個能最多儲存20個char型元素的數組,它可以被表示為:
因此,在這個數組中在理論上我們可以儲存一個最多包含20個字元的字元序列。但是我們也可以存更短的序列。例如,jenny可以在一個程式中的某處儲存序列“Hello”或序列“Merry Chrismas”,因為它們兩個都少於20個字元。
因此,由於字元數組可以儲存少於其總長度的序列,一個特殊的字元別用來標示有效序列的結束:“Null 字元”(null character),它在字面上被寫為’/0’(反斜線,零)。
我們的有20個char型元素的叫做jenny的數組儲存字元序列“Hello”和“Merry Christmas”可以表述如下:
注意怎樣為了指示序列的結束在序列的末尾加入了
null字元(
'/0’)。灰顏色的格表示
char元素的值不確定。
初始化以
null
結尾的序列因為字元數組是普通的數組,因此它們也遵守同普通數組相同的規則。例如,如果我們想用一些提前確定好的字元來初始化一個字元數組,我們可以就像對其它數組那樣完成它:
| char myword[] = { 'H', 'e', 'l', 'l', 'o', '/0' }; |
在這種情況下我們就聲明了一個有6個
char型元素的數組,並且其被初始化為“
Hello”並在結尾附加了一個
null字元’
/0’。但是字元數組由另一個初始化的方法:使用字串。在前面章節我們已經使用的運算式中,表示全部字串的常量已經出現了多次。它們都是被一對雙引號(")括起來的文本。例如:
就是以惡我們或許已經使用過的一個字串常量。帶雙引號(")的字串是字串常量,它們的類型實際上是
null結尾的字元數組。所以被雙引號括起來的字串常量通常在結尾被自動加入了一個
null字元(
'/0’)因此我們可以用下面兩種方法中的任意一種來給叫做myword的字元數組初始化為一個null結尾的序列:
| char myword [] = { 'H', 'e', 'l', 'l', 'o', '/0' };char myword [] = "Hello"; |
在這兩種情況中,字元數組
myword都被聲明為了一個大小為6個
char型元素的數組:其中5個對應單詞“
Hello”再加上一個標示序列結束的終止
null字元('
/0’),在第二種情況中,即使用了雙引號(
"),
null字元被自動添加。請注意:我們討論的是在一個字元數組在它聲明時被初始化的情形,而不是在它們已經被聲明了之後給它們賦值。事實上因為
null結尾的字元數組的類型是普通的數組,我們有和任何其它數組相同的限制,因此我們不能用一個賦值操作來拷貝資料區塊。假設
mytext是一個
char[]型變數,在一個原始碼中的像這樣的運算式:
| mystext = "Hello";mystext[] = "Hello"; |
將是
無效的,像下面這個一樣:
| mystext = { 'H', 'e', 'l', 'l', 'o', '/0' }; |
這個原因可能在你有了一點更多的關於指標的知識後會更清楚,因為到那時就會很清晰:一個數組實際上是一個指向一個記憶體塊的常量指標。
使用以
null
結束的字元序列以null結尾的字元序列是在C++中處理字串的普通方法,因此它們像在很多程式中那樣使用。事實上,通常的字串有這個類型(
char[])也用於很多地方。例如,cin和cout支援以null結尾的序列為有效字元序列的容器,因此它們可以被直接用於從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: JohnHello, John! |
就像你看到的,我們聲明了3個字元數組。前兩個被用字串常量初始化,而第三個沒有被初始化。在任何情況下,我們都必須指明數組的大小:頭兩個(
question和
greeting)的大小是根據初始化它們的字串常量來定義的。而對於
yourname我們則進行了顯式的說明:它的大小是80個
char。最後,儲存在數組中的字元序列能夠和容易的通過賦值運算子轉換成string對象:
| string mystring;char myntcs[]="some text";mystring = myntcs; |