1. 程式人生 > >【字串】字元陣列和字串區別詳解

【字串】字元陣列和字串區別詳解

C 語言中並不存在字串這個資料型別,而是使用字元陣列來儲存字串。那麼,字元陣列就一定是字串嗎?

對於這個問題,大多教科書中的回答是“是”。其實不然,字元陣列和字串是完全不相同的兩個概念,千萬不要混淆。分析如下所示的示例程式碼。

 1 #include <stdio.h>
 2 #include <string.h>
 3 int main(void)
 4 {
 5     /*字元陣列賦初值*/
 6     char cArr[] = {'I','L','O','V','E','C'};
 7     /*字串賦初值*/
 8     char sArr[] = "
ILOVEC"; 9 /*用sizeof()求長度*/ 10 printf("cArr的長度=%d\n", sizeof(cArr)); 11 printf("sArr的長度=%d\n", sizeof(sArr)); 12 /*用strlen()求長度*/ 13 printf("cArr的長度=%d\n", strlen(cArr)); 14 printf("sArr的長度=%d\n", strlen(sArr)); 15 /*用printf的%s列印內容*/ 16 printf("cArr的內容=%s\n", cArr); 17 printf("
sArr的內容=%s\n", sArr); 18 return 0; 19 }

從程式碼及其執行結果中可以看出如下幾點。

首先,從概念上講,cArr 是一個字元陣列,而 sArr 是一個字串。因此,對於 sArr,編譯時會自動在末尾增加一個 null 字元(也就是'\0',用十六進位制表示為 0x00);而對於 cArr,則不會自動增加任何東西。

記住,這裡的 sArr 必須是“char sArr[7]="ILOVEC"”,而不能夠是“char sArr[6]="ILOVEC"”。

其次,“sizeof()”運算子求的是字元陣列的長度,而不是字串長度。因此,對於“sizeof(cArr)”,其執行結果為 6;而對於 sizeof(sArr),其執行結果為 7(之所以為 7,是因為 sArr 是一個字串,編譯時會自動在末尾增加一個 null 字元)。因此,對於以下程式碼:
1
/*字元陣列賦初值*/ 2 char cArr[] = {'I''L''O''V''E''C'}; 3 /*字串賦初值*/ 4 char sArr[] = "ILOVEC";

也可以寫成如下等價形式:

1 /*字元陣列賦初值*/
2 char cArr[6] = {'I''L''O''V''E''C'};
3 /*字串賦初值*/
4 char sArr[7] = "ILOVEC";

最後,對於字串 sArr,可以直接使用 printf 的 %s 列印其內容;而對字元陣列,很顯然使用 printf 的 %s 列印其內容是不合適的。

通過對以上程式碼的分析,現在我們可以很簡單地得出字元陣列和字串二者之間的區別:
  • 對於字元陣列,其長度是固定的,其中任何一個數組元素都可以為 null 字元。因此,字元陣列不一定是字串。
  • 對於字串,它必須以 null 結尾,其後的字元不屬於該字串。字串一定是字元陣列,它是最後一個字元為 null 字元的字元陣列。