前言
字符串(character string)是一個或多個字符的序列,很多高級語言像 java陋率、C#球化、Kotlin 都有字符串類型,但是 C 語言并沒有提供符串?dāng)?shù)據(jù)類型瓦糟,而是使用 char 類型的數(shù)組元素來存儲字符串筒愚。
在 C 語言中定義字符串有下列幾種形式:
- 字符串常量;
- char 數(shù)組菩浙;
- char 指針巢掺。
一、字符串常量
字符串常量的例子非常常見劲蜻,它是放在一對雙括號中的一串字符或符號陆淀。一對雙括號之間的任何內(nèi)容都會被編譯器視為字符串,包括特殊字符和嵌入的空格先嬉。當(dāng)使用 printf() 顯示信息時轧苫,就將該信息定義為字符串常量了,看以下示例:
printf("This is a string.");
printf("This is on\ntwo lines.");
printf("Foor \" you write \\\".");
執(zhí)行結(jié)果如下:
This is a string.
This is on
two lines.
For " you write \".
使用特殊字符時要注意轉(zhuǎn)義字符“\”的用法坝初。下面來看字符串常量在內(nèi)存中的存儲形式浸剩,如下圖所示:
每個字符串的末尾都自動添加了代碼值為 0 的特殊字符,這個字符稱為空字符鳄袍,寫為 \0绢要。C 中的字符串總是由 \0 字符結(jié)束,因此字符串的長度要比字符串中的字符數(shù)多 1拗小。
要注意的是重罪,在 printf() 函數(shù)遇到第一個空字符 \0 時就會停止輸出。
二哀九、存儲字符串的變量
C 語言對變量存儲字符串的語法沒有特殊的規(guī)定剿配,而且 C 中根本就沒有 字符串變量,也沒有處理字符串的特殊運算符阅束,但是標(biāo)準(zhǔn)庫中提供了很多函數(shù)來處理字符串呼胚。
2.1 char 數(shù)組
可以使用 char 數(shù)組來保存字符串,這也是字符串變量的最簡單的形式息裸,char 數(shù)組的聲明如下:
char exp[32];
該變量可以存儲一個最多包含 31 個字符的字符串蝇更,因為要預(yù)留一個數(shù)組元素給終止符“\0”沪编。
注意:如果使用這個數(shù)組來存儲 32 個字符(數(shù)組末位不是終止符),那么以上的 char 數(shù)組就不是表示一個字符串了年扩,僅僅是一個 char 數(shù)組而已蚁廓。
看另一種聲明方式,這里使用以下聲明初始化字符串變量:
char exp[] = "This is a string.";
這里并沒有指定數(shù)組大小厨幻,編譯器會指定一個足以容納這個初始化字符串常量的數(shù)值相嵌。在上例中數(shù)組大小為 18,其中前 17 個元素用來存儲字符况脆,最后一個用來存儲終止符“\0”饭宾。
要引用存儲在數(shù)組中的字符串,只需要使用數(shù)組名即可漠另,例如使用 printf 函數(shù)輸出存儲在數(shù)組中的字符串捏雌,%s 用于輸出一個用空字符中止的字符串:
printf("the content of the array is %s\n", standard);
三、字符指針
可以通過指針來表示字符串笆搓,一般形式如下:
char* string = "This is a string.";
這里有一點要注意:可以對上面的 string 整體賦值性湿,但是不能修改字符串中的任一字符,否則會提示訪問沖突满败。例如:
string++; string = 'y';
string[1] = 'e';
在這段代碼中肤频,string 本質(zhì)上是一個字符指針,占 4 字節(jié)算墨;"This is a string." 分配在代碼段宵荒,占 18 個字節(jié);實際上總共耗費了 22 個字節(jié)净嘀,這 22 個字節(jié)中:4 字節(jié)的指針 string 叫做字符串指針(用來指向字符串的报咳,但是它本身不是字符串),17 字節(jié)的用來存 "This is a string" 這 17 個字符的內(nèi)存才是真正的字符串挖藏,最后一個用來存 '\0' 的內(nèi)存是字符串結(jié)尾標(biāo)志(本質(zhì)上也不屬于字符串)暑刃。
四、字符串常用的方法
請參考 C 在線手冊:http://www.kuqin.com/clib/
五膜眠、總結(jié)
C 語言中字符串的本質(zhì):指針指向頭岩臣、固定尾部的地址相連的一段內(nèi)存。
字符串就是一串字符宵膨。字符反映在現(xiàn)實中就是文字架谎、符號、數(shù)字等人用來表達(dá)的字符辟躏,反映在編程中字符就是字符類型的變量谷扣。C 語言中使用 ASCII 編碼對字符進(jìn)行編程,編碼后可以用 char 型變量來表示一個字符捎琐。字符串就是多個字符打包在一起共同組成的抑钟;
字符串在內(nèi)存中其實就是多個字節(jié)連續(xù)分布構(gòu)成的(類似于數(shù)組涯曲,字符串和字符數(shù)組非常像);
C 語言中字符串有 3 個核心要點:
- 第一是用一個指針指向字符串頭在塔;
- 第二是固定尾部(字符串總是以'\0'來結(jié)尾);
- 第三是組成字符串的各字符彼此地址相連拨黔。
'\0' 是一個 ASCII 字符蛔溃,其實就是編碼為 0 的那個字符(真正的 0,和數(shù)字 0 是不同的篱蝇,數(shù)字 0 有它自己的 ASCII編碼)贺待。要注意區(qū)分 '\0' 和 '0' 和 0;
'\0' 作為一個特殊的數(shù)字被字符串定義為結(jié)尾標(biāo)志零截。產(chǎn)生的副作用就是:字符串中無法包含 '\0' 這個字符麸塞。