C++字串詳解

2020-07-16 10:04:42
許多程式都大量應用到字串。C++ 為處理字串提供了兩種不同資料型別:C 字串 string 類

string 類庫有許多處理字串的函數,這些函數可以執行許多實用的和字串相關的功能,並且提供了程式設計上的安全防護,而這正是 C 字串處理常式所缺乏的。出於以上理由,你應該會更喜歡使用 string 類而不是 C 字串。

儘管如此,每個 C++ 程式設計師都應該對C字串有足夠的了解。string 類構建於 C 字串之上,所以,了解 C 字串有助於理解 string 類。此外,還有很多程式是在 string 類加入到 C++ 標準之前編寫的,這樣的程式需要能理解 C 字串的程式設計師來維護它們。最後,程式設計師如果需要編寫和維護底層程式碼,例如 string 類庫或作業系統的一部分,則必須使用 C 字串來表示字串資料。

C 字串是儲存在連續記憶體位置中的字元序列,並以 null 字元結尾。回想一下,null 字元是 ASCII 碼為 0 的字元。在程式中,null 字元通常寫成 ''。程式中通常使用整數 0 或常數 NULL 來表示 null 字元。因此,以下所有語句都會將 null 字元儲存到字元變數中:
char ch1, ch2, ch3;
ch1 = '';
ch2 = 0;
ch3 = NULL;
由於陣列是一系列連續的儲存位置,它們儲存相同型別的值,所以 C 字串實際上是一個以 NULL 結尾的字元陣列。C 字串可以按以下 3 種形式之一出現在程式中:
  1. “寫死”字串文字。
  2. 程式設計師定義的字元陣列。
  3. 指向字元的指標。

無論 C 字串以 3 種形式中的哪一種出現在程式中,它始終是以 null 字元結尾的字元陣列,並由指向陣列中第一個字元的指標表示。換句話說,C 字串的型別就是以下形式的:

char *

也就是說,C 字串的型別是指向 char 的指標。

字串常數

字串常數作為用雙引號括起來的字元序列直接寫入程式中。例如:

"What is your name?"
"Bailey"

以上都是字串常數。

當編譯器遇到諸如 "Bailey" 這樣的字串常數時,它分配一個由 7 個字元組成的陣列,在陣列的前 6 個條目中儲存 "Bailey" 的 6 個字元,然後將 null 字元儲存在最後一個條目中,如圖 1 所示。然後,編譯器將陣列的第一個字元的地址(char * 型別)作為字串常數的值。


圖 1 字串常數的陣列