C + + 字串常值

字串常值包含雙引號的來源字元集的零個或多個字元 (")。字串常值 (String Literal) 表示,聚集在一起,形成 null 結尾字串的字元序列。

字串常值 (String Literal) 可能包含從來源字元集的所有圖形字元除了雙引號 ("),反斜線 (\),或新行字元。它們可能包含在 C + + 字元常數描述相同的逸出序列 (Escape Sequence)。

C++ 字串具有下列型別:

  • 陣列 char[n],其中 n 是字串的長度 (以字元為單位) 加上指示字串結尾的 1 結束的 '的\ 0'

  • 陣列, wchar_t字元字串。

修改字串常數的結果未定義。例如:

char *szStr = "1234";
szStr[2] = 'A';      // Results undefined

Microsoft 專有的

在某些情況下,相同字串常值「可組合」節省可執行檔的空間。在字串常值共用,編譯器會產生特定字串常值 (String Literal) 的所有參考指向相同位置在記憶體中,而是將每個參考指向字串常值 (String Literal) 的個別執行個體。/GF 啟用字串共用。

Microsoft 專有的結尾

當指定時,字串常值相鄰字串串連。因此,這個宣告:

char szStr[] = "12" "34";

與這個宣告相同的:

char szStr[] = "1234";

相鄰字串中所使用的連接可讓您輕鬆地指定跨多行的長度的字串:

cout << "Four score and seven years "
        "ago, our forefathers brought forth "
        "upon this continent a new nation.";

在上述範例中,整個字串 Four score and seven years ago, our forefathers brought forth upon this continent a new nation. 一起結合。這個字串也可以指定使用不規則線條如下所示:

cout << "Four score and seven years \
ago, our forefathers brought forth \
upon this continent a new nation.";

在這個常數的所有相鄰字串串連之後, null 字元, '\0',附加的字串處理函式的 C 提供字串結尾標記。

當第一個字串包含逸出字元時,字串串連可能產生意外的結果。請考慮下列兩個宣告:

char szStr1[] = "\01" "23";
char szStr2[] = "\0123";

雖然假設是很自然的, szStr1 和 szStr2 包含相同的值,因此實際包含的值如下圖所示。

逸出字元和字串串連。

逸出和字串的串連

Microsoft 專有的

字串常值的最大長度為 16,384 (大約 16K 位元組)。這項限制適用於型別 char[] 和 **wchar_t[]**字串。如果字串包含以雙引號括住的部分,前置處理器會串連成單一字串,組件,並指定連接字串的每一行,它會將額外的位元組的位元組總數。

例如,假設字串包含為 50 個字元的 40 行每一行 (2,000 個字元) 和為 7 個字元的一行,,且每一行以雙引號括住。這不一定為 2,007 個位元組加上結束的 null 字元的位元組,共有 2,008 個位元組。在連接,將額外的字元加入至總數前 40 個資料行中每個的。這個共有 2,048 個位元組。(額外的字元會寫入至最後的資料不會覆寫)。不過,請注意,如果,行接續字元 (\) 使用取代雙引號,前置處理器並不會將每一行的額外的字元。

Microsoft 專有的結尾

藉由計數的字元數加 1 和結束的 '\0' 的或 2 來判斷字串物件的大小類型的 wchar_t。

由於雙引號 (") 括住字串,請使用逸出序列 (\") 表示附加的雙引號。單引號 (') 可以表示,而不會逸出序列 (Escape Sequence)。反斜線字元 (\) 是行接續字元,當位於行尾。如果您想要反斜線字元字串內,您必須 type2 反斜線 (\\)。(請參閱在 前置處理器參考的階段轉譯 有關行接續的詳細資訊)。

若要指定字串型別寬字元 (wchar_t[]),在開頭前面加上雙引號字元 L。例如:

wchar_t wszStr[] = L"1a1g";

字元常數 列出的所有標準逸出程式碼是有效的字串常數。例如:

cout << "First line\nSecond line";
cout << "Error! Take corrective action\a";

由於逸出程式碼結束於不是十六進位數字的第一個字元,字串常數的規格與內嵌十六進位逸出程式碼可能會導致無法預期的結果。下列範例是要建立包含 ASCII 5 的字串常值 (String Literal),後面接著字元 five:

"\x05five"

這個實際結果是十六進位 5F,也就是底線的 ASCII 碼,後面接著 ive字元。下列範例會產生預期的結果:

"\005five"     // Use octal constant.
"\x05" "five"  // Use string splicing.

請參閱

參考

C + + 的常值