字串常量包含乙個字串行(也包括空格),均位於乙個雙引號中,例如:
「hello world!/n」
與字元常量一樣,字串常量可以包含源字符集中的所有字元,唯一例外就是使用雙引號,反斜槓
(/)、換行符等需要通過轉義來表示,下面
printf
語句中首先產生乙個警告音,接著,在雙引號中指定乙個目錄,使用
%s來替代指標
doc_path
char doc_path[128] = 「.//share//doc」;
printf(「/asee the documentation in the directory /」%s/」/n」, doc_path」);
字串常量是乙個靜態
char
陣列,它包含以字串結束符
null(/0
)結束的字元碼。空串
」」在記憶體中占用乙個位元組,因為它包含了
null
字元。不能用一位元組儲存的字元使用多位元組來儲存。
如前面所有的例子,你可以使用乙個字串來初始化乙個字元陣列,也可以用它來初始化乙個
char
指標:char *pstr = 「hello, world!」;
//pstr points to the first character, 『h』
在這種初始化中,字串常量表示每乙個元素的位址,這跟陣列名是一樣的。
在example 3-1
中,資料
error_msg包含3
個char指標,
每乙個賦值乙個字串首字母的位址。
example 3-1. sample function error_exit( )
#include
#include
void error_exit(unsigned int error_n)
;unsigned int arr_len = sizeof(error_msg)/sizeof(char *);
if (error_n > = arr_len)
error_n = 0;
fput(error_msg[error_n], stderr);
exit(1);
}與寬字元常量一樣,你可以使用字首
l在字串常量中使用寬字元:
l」here`s a wide-string literal.」
寬字串常量定義乙個以
null
結束的陣列,它的元素型別為
wchar_t,
陣列通過轉換多位元組為寬字元來初始化,這與標準函式
mbstowcs()
一樣。同樣地,使用轉義表示的任何通用字元名以單個的寬字元儲存。
在下面的例子中
, /u03b1
表示通用字元a,
wprintf()
為printf
函式的寬字元版本。用來格式化和列印乙個寬字串:
doubel angle_alpha = 90.0/3;
wprintf(l」angel /u03b1 measures %lf degress./n」, angle_alpha);
字串常量中的任何多位元組字元或轉義字元均不能在執行時字符集中表示,它們的值取決於編譯器。
編譯預處理器連線任何以空格隔開的單個相鄰字元,如下所示,這種連線使為了字串易於閱讀而分成多行變得容易了:
#define prg_name 「easyline」
char msg = 「the installation of 」 prg_name
「is now complete.」;
如果連線的任一字串是寬字元常量,剛連線後的結果串也為乙個寬字串。
另一種分隔乙個字串為多行的方法是使用反斜槓結束,如下面的例子:
char info =
「this is a string literal broken up into /
several source code lines./nnow one more line:/n/
that`s enough, the string ends here.」;
字串將在新行的開始繼續,任何在左頁邊的空格,例如
several
前的空格,均是字串的一部分,此外,此串包含了兩個換行符,乙個在
now前,另乙個在
that`s
之前。編譯器解釋轉義字元在連線相鄰串之前,所以,下面來自乙個寬字串的兩個字串常量以
』/xa7』
和』2』
開始:l」/xa7」 l」2 et cetera」
然而,如果這個串寫在一起,如
l」/xa72 et cetera」,
則串中每個字元為寬字元
』/xa72』。雖然
c沒有嚴格禁止修改字串常量,你也不應該嘗試這樣做,在下例中,第二個語句就是嘗試替換字串是首字元:
char *p = 「house」; //initialize a pointer to char
*p = 『m』;
//this is not a good idea!
這個語句不被禁止,但在有些系統上會引起執行時錯誤,首先,編譯器當做乙個常量去處理字串,可能將它置於唯讀記憶體,所以試圖進行寫操作將會引起錯誤,其次,如果兩個或更多的相同串在程式中使用,編譯器會將它們儲存在相同的位置,所以修改可能會引起另外乙個使用它的地方出現異常。
然而,當你使用乙個字串來初始化陣列變數,你可以修改陣列內容:
char s = 「house」
//initialize an array of char
s[0] = 『m』
//now the array contains the string 「mouse」.
C核心技術手冊(十三)
程式必須儲存和處理不同種類的資料,如整型和浮點數,編譯器需要知道給定的數值所代表的資料型別是什麼。在c 中,術語 物件 為記憶體中的一塊位置,它的內容代表值,物件也叫做變數,乙個物件的型別決定了此物件在內存在所占有的空間大小和它可能的取值範圍。例如 相同模式的位元位可以完全表示不同的整形,這取決於資...
C核心技術手冊(二十)
在c 中,常量是表示乙個固定值的記號,它可能是整型 浮點型 字元 或乙個串。乙個常量的型別由它的值和記法來決定。這裡討論的常與混合常量不同,混合常量在c99 標準中介紹,它通常是可修改的物件,類似於變數,了解混合常量的詳細介紹和特殊操作可參見第五章。乙個整型常量可以以普通的十進位制數表示,或者是八進...
C核心技術手冊(二十四)
在 c中,不同型別的操作可以化合成乙個操作,例如,下面的表述式 double dvar 2.5 define dvar as a variable of type double.dvar 3 multiply dvar by an integer constant.if dvar 10l compa...