天天看點

【C語言進階剖析】30、C語言中的字元串

1 字元串的概念

1.1 字元數組與字元串

1.2 小秘密

2 字元串字面量

3 字元串的長度

4 小結

字元串是有序字元的集合

字元串是程式的基本元素之一

c 語言中沒有字元串的概念

c 語言中通過特殊的字元數組模拟字元串

c 語言中的字元串是以 ‘\0’ 結尾的字元數組

在 c 語言中,雙引号引用的單個或多個字元是一種特殊的字面量

存儲于程式的全局隻讀存儲區

本質為字元數組,編譯器自動在結尾加上 ‘\0’ 字元

下一個下面哪些是字元串的定義?

【C語言進階剖析】30、C語言中的字元串

我們現在分析一下,字元串就是一個字元數組,在末尾加上 ‘\0’。

數組 ca 是一個字元數組,沒有以 ‘\0’ 結尾,是以不是字元串;

sa 是以 ‘\0’ 結尾的字元數組,是以是字元串;

“hello world!” 是一個字元數組,我們用一個字元數組去初始化 字元數組 ss,這在 c 語言中是合法的,編譯器會自動在 “hello world!” 末尾加上 ‘\0’ ,是以 ss 是字元串;

用一個指針去指向字元數組,我們不是經常這麼幹嘛,str 是字元串。

下面我們用編譯器驗證一下我們的分析:

編譯運作結果如下:

可以看到 ca 列印的結果是不對的,sa,ss,str 列印的結果是完全正确的,是以 ca 是一個字元數組,sa,ss,str 是字元串。

字元串字面量本質是一個數組

字元串面量可以看作常量指針

字元串字面量中字元不可改變(因為存儲在全局隻讀存儲區)

字元串字面量至少包含一個字元(至少包含 ‘\0’)

字元串字面量是一個字元數組,比如 “hello world!” 就是一個無名的字元數組

請看下面的表達式合法嗎?

【C語言進階剖析】30、C語言中的字元串

上面的寫法看起來都比較奇怪,對一個字元串字面量進行下标運算,和整數進行加法運算,對空字元串解引用,我們用編譯器驗證一下:

對于上面的結果,“abc”[0] 等于取字元串第一個字元,*(“123” + 1); 是取字元串第 2 個字元,*"" 是對空字元串第一個字元解引用,,第一個字元是 ‘\0’,我們列印的是 %p,是列印對應的ascii 碼, ‘\0’ 對應的 ascii 是 0。 字元串的是以 ‘\0’ 作為結束标志的, ‘\0’ 之後的内容不屬于該字元串,是以 printf("%s\n", “hello\0hello”); 語句會列印出 hello

字元串的長度就是字元串所包含字元的個數

字元串長度指的是第一個 ‘\0’ 字元前出現的字元個數

通過 ‘\0’ 結束符來确定字元串的長度

函數 strlen 用于傳回字元串的長度

下面看一個 strlen 使用的例子

編譯運作,結果如下:

可以看到列印數組 s 的元素時,所有的元素列印出來了,兩個空行分别是兩個 ‘\0’,一個在中間,一個是編譯器自己加上的 ‘\0’,但是列印字元串 s 時,字元串的結束标志是 ‘\0’,是以隻列印了 hello。同樣的,字元串長度是第一個 ‘\0’ 字元前出現的字元個數,字元串 s 的長度是 5。

1、c 語言中通過字元數組模拟字元串

2、c 語言中的字元串使用 ‘\0’ 作為結束符

3、字元串字面量的本質為字元數組

4、字元串相關函數都依賴于結束符 ‘\0’