C風格字符串特指在C語言字符串的存儲方式。 在程式語言中,常常需要表示一段字符,如「今天你吃了麼」,「how are you?」,「afjsa234234(*&(*(」等等。同一種字符串的寫法在不同的程式語言中表示的字面值都是一樣的,即引號中間的內容,但是在存儲的處理上往往不一樣。

C語言中字符串的處理 編輯

在C語言中,字符串是以字符數組的形式進行存儲的,且在數組中以'\0'作為終結符。由於'\0'在ASCII中表示空字符NULL),即在語意上不可能有有效字符與之重複,故用其來表示字符串的結尾至少在ASCII編碼下是合理的。

C++中字符串的處理 編輯

C++語言中,除了繼承了C語言中的這種字符串表達形式外,還新添了string類用來表達字符串。就表義來說,這兩種字符串存儲方式是等價的,但在處理的過程中卻有顯著的區別。在string類中,所有的對字符串的操作都被封裝為成員函數,因此只要string內部有統一的約定,可以不在使用'\0'作為結尾標誌。但對於C語言中的字符串,所有的操作都是來源於<cstring>中的以str開頭的函數,這些函數的特點就是都以'\0'作為所處理的字符串的結尾標誌。

由於這些顯著的特點,為了區分C++中這兩種不同的字符串,使用「C風格字符串」來特指來源於C語言的字符串存儲方式。

與編碼規範的衝突 編輯

ASCII編碼及其擴充規範中,每個字符長度都不超過1Byte,因此,在C風格字符串中用'\0'表示結尾是合法的。但在UTF16編碼中,每個字符使用2Byte進行編碼,故會出現其中一個字符為0x00的情況,此時如果仍使用C風格字符串,則在使用相關函數進行處理時,會在第一個0x00出現的位置就被認為是字符串已經結束,但其實字符串並不在此處終結。

UTF8是一種很好的解決方案,UTF8中字符的編碼非定長,可能是1Byte或者是2Byte,但是這種編碼方案中用每個字符的前綴來表示當前字符的長度,因此既有足夠的空間來存儲較多的字符,又不會出現0x00導致字符串在被以C風格字符串處理時異常結束。