char類型的數組被稱作字元數組,通常用來儲存字串。字串是附加有特殊字元(串尾標誌)的字元序列。串終止字元表明字串已經結束,該字元由逸出序列'/0'定義,有時被稱為空白字元,佔用一個位元組,其中8位全為0。這種形式的字串經常被稱作C型字串,因為以這樣的方式定義字串是在C語言中推出的,後來Bjarne Stroustrup以C語言為基礎開發出了C++。這不是唯一能用的字串標記法,本書稍後將介紹其他表示方法。特別需要指出的是,C++/CLI程式使用一種不同的字串標記法,而MFC定義了表示字串的CString類。
C型字串在記憶體中的表示4-2所示。
圖4-2說明了記憶體中字元的表示形式,同時給出一種我們即將討論的的字串聲明形式。
注意:
字串中每個字元佔用一個位元組,因此算上最後的Null 字元,字串需要的位元組數要比包含的字元數多一個。
我們可以用字串字面值來聲明並初始化字元數組。例如:
- char movie_star[15] = "Marilyn Monroe";
注意,終止字元'/0'是編譯器自動添加的。如果在該字面值中顯式添加'/0',則最終將得到兩個Null 字元。但是,我們給字元數組指定元素數量時必須考慮到終止字元的存在。
4-1所示,我們可以讓編譯器來算出已初始化的數組的長度。下面是另一個樣本:
- char president[] = "Ulysses Grant";
因為長度沒有指定,所以編譯器將分配足夠的記憶體空間來容納該初始化字串及終止字元。在本例中,編譯器將給數組president分配14個元素。當然,如果希望稍後使用該數組來儲存另一個字串,則其長度(包括終止Null 字元)不能超過14個位元組。通常,確保數組足以儲存隨後希望儲存的任何字串是編程人員的職責。
我們也可以建立由Unicode字元組成的字串,字串中的字元類型為wchar_t。下面是一個建立Unicode字串的語句:
- wchar_t president[] = L"Ulysses Grant";
首碼L表示字串字面值是一個寬字元串,因此字串中的每個字元(包括終止Null 字元)都會佔兩個位元組。當然,對字串的索引會引用字元,而不是位元組,因此president[2]對應於字元L'y'。
1. 字串輸入
<iostream>標頭檔包含許多從鍵盤上讀取字元的函數定義。下面將看到的是getline()函數,該函數讀取從鍵盤輸入的字元序列,並將其以字串形式(以'/0'字元終止)存入字元數組中。我們通常像下面這樣使用getline()函數:
- const int MAX = 80;
// Maximum string length including /0 - char name[MAX]; // Array to store a string
- cin.getline(name, MAX, '/n');
// Read input line as a string
這些語句首先聲明一個有MAX個元素的char型數組name,然後使用getline()函數從cin中讀取字元。如上所示,資料來源cin與函數名稱之間有一個句點。句點表示我們在調用的getline()函數屬於cin對象之一。getline()函數中各參數的意義在圖4-3中給出。
因為getline()函數的最後一個參數是'/n'(分行符號或行結束字元),而第二個參數是MAX,所以如果讀到'/n'字元,或者已經讀入MAX-1個字元,則無論哪種情況先發生,都停止從cin讀取字元。可讀取的最大數量是MAX-1而不是MAX,因為數組中儲存的字元序列要附加'/0'字元。在鍵盤上按Return鍵將產生'/n'字元,因此它通常是最方便的使輸入終止的字元。當然,我們可以通過改變最後一個參數而指定其他字元。輸入數組name中不儲存'/n'字元,但前面曾經說過,'/0'字元將附加到數組中輸入字串的尾部。
稍後討論類時,我們將學習更多與這種文法形式有關的知識。在此期間,我們只需視之為理所當然,並在樣本中使用它即可。
試一試:編程處理字串
現在,我們已經有足夠的知識來編寫一個讀取字串並計算其中包含多少字元的簡單程式。
- // Ex4_03.cpp
- // Counting string characters
- #include <iostream>
- using std::cin;
- using std::cout;
- using std::endl;
-
- int main()
- {
- const int MAX = 80; // Maximum array dimension
- char buffer[MAX]; // Input buffer
- int count = 0; // Character count
-
- cout << "Enter a string of less than 80 characters:/n";
- cin.getline(buffer, MAX, '/n');
// Read a string until /n -
- while(buffer[count] != '/0') // Increment count as long as
- count++; // the current character is not null
-
- cout << endl
- << "The string /"" << buffer
- << "/" has " << count << " characters.";
- cout << endl;
- return 0;
- }
該程式的典型輸出如下所示:
- Enter a string of less than 80 characters:
- Radiation fades your genes
- The string "Radiation fades your genes" has 26 characters.
樣本說明
該程式首先聲明一個字元數組buffer,然後顯示一條提示使用者輸入的訊息,之後將從鍵盤輸入的字串讀入到buffer數組中。當使用者按下Return鍵,或者已經讀入MAX-1個字元時,則結束從鍵盤讀取字元的操作。
while迴圈用來計算輸入字元的個數。只要buffer[count]引用的當前字元不是'/0',該迴圈就繼續執行。像這樣一邊在數組中逐步前進,一邊檢查當前的字元,是本地C++程式中常見的一種技術。該迴圈中的唯一動作是每看到一個非Null 字元,就使count加1。
注意:
庫函數strlen()的功能和該迴圈的功能相同,這個函數將在本章後面介紹。
在樣本的最後,我們用一條輸出語句來顯示輸入的字串和字元數量。注意,使用逸出字元'/"'是為了輸出雙引號。