1. 程式人生 > >c-一維字元陣列

c-一維字元陣列

一維字元教組的定義及初始化

一維字元陣列的定義格式為:

char 陣列名[陣列大小];

例如:

 
  1. char c[10];

該語句定義了一個一維字元陣列 c,大小為 10,即佔 10 個字元變數空間,最大可儲存長度為 9 的字串(第 10 個字元為 '0')。由於沒有顯式給每個字元變數賦值,故每個字元變數為隨機值。

可以採用單個字元逐個賦值的方式初始化,也可以使用字串初始化的方式。

採用逐個字元賦值的方式

1) 當字元個數少於陣列空間大小時,例如:

 
  1. char c[8] = {'h','e','l','l','o',};//始值個數5小於陣列空間個數8

該語句定義了含 8 個字元變數的一維字元陣列,前 5 個字元變數分別顯式初始化為 'h','e','l','l','o' 等 5 個字元,後 3 個字元變數為空字元 '\0'。其儲存形式如下。



當字元陣列中含有字串結束字元 '\0' 時,可以使用 printf 函式及格式控制符 %s,輸出該字元陣列中的字串,如下所示。

 
  1. printf ("%s”,c); //陣列名 c 為首字元 'h' 的地址或者為 &c[0]

注意:使用 printf 函式及格式控制符 %s,輸出一個字串時,輸出列表中一定為某個字元的地址,且從該字元開始的串一定有結束標誌 '\0'。該語句的功能是:從輸出列表中的該地址開始,到第一次遇到 '\0' 為止,這之間的字元全部輸出。

通常一維陣列初始化時,其第一維大小可以省略,例如:

 
  1. char c[]={'h','e','l','l','o'};

對應的陣列儲存形式如下所示。



由於該陣列中不存在 '\0' 字元,故不能使用 printf("%s",c); 輸出。

 
  1. char c[8] = {'h','e','l','l','o'};

不等價於

 
  1. char c[]={'h','e','l','l','o'};


2) 當字元個數等於陣列空間大小時,例如:

 
  1. char c[5]={'h','e','l','l','o'};//初值個數5等於陣列大小5

執行該初始化語句後,陣列的儲存形式如下所示。



 

 
  1. char c[5]={'h','e','l','l','o'};

等價於

 
  1. char c[]={'h','e','l','l','o'};

由於該字元陣列中不包含字串結束標誌 '\0',故不能使用 printf("%s",c); 輸出其中的字串。輸出結果中一般含有隨機亂碼。

這種情況一般採用迴圈語句逐個輸出該陣列中的每個字元。

 
  1. int i;
  2. for(i=0;i<5;i++) //迴圈次數為字元個數或陣列大小
  3. printf ("%c",c[i]);//格式控制符為%c,輸出列表中為字元變數c[i]


3) 當字元個數多於空間大小時,編譯時報錯。例如:

 
  1. char c[4] = {'h','e','l','l','o'}; //錯誤。初值個數5大於陣列大小4

採用字串初始化的方式

在 C 語言中,字串一般是指含有字串結束符 '\0' 的若干個字元的集合。而使用雙引號括起來的字串常量,預設隱含字串結束符 '\0'。例如:

 
  1. char c[12] = {"C program"}; //注意該陣列大小應足夠大

用字串對字元陣列初始化時,一般大括號可以去掉,即:

 
  1. char c[12]="C program";

該初始化語句與以下三條語句均是等價的。

 
  1. char c[12]= {'C',' ','p','r','o','g','r','a','m','\0','\0','\0'};

或者:

 
  1. char c[12] = {'C',' ','p','r','o','g','r','a','m','\0'};

或者:

 
  1. char c[12] = {'C',' ','p','r','o','g','r','a','m'};

以上等價初始化語句有一個共同特點:陣列的大小均為指定值 12。

其陣列儲存形式均如下所示。



採用字串對字元陣列進行初始化時,一般省略一維陣列空間的大小,即:

 
  1. char c[]="C program";

該陣列中除了儲存字串中的 9 個有效字元外,還自動在字串的結尾儲存 '\0' 字元。即該陣列的大小為 10。其儲存形式如下所示。



為節省空間及書寫方便,當用字串對字元陣列初始化時,一般均省略其一維的大小。

一維字元陣列的引用

字元陣列中的每一個元素都是一個字元,可以使用下標的形式來訪問陣列中的每一個字元。

例如

 
  1. char c[]="abcd";

定義了一個一維字元陣列 c,用字串常量對其初始化,該陣列大小為 5,前 4 個元素的值分別為 'a'、'b'、'c'、'd',第 5 個元素的值為 '\0'。其儲存形式如下所示。



 

可以使用 c[i] 引用該陣列中的每個元素,例如:

 
  1. c[2]='f'; //把'f'賦給元素c[2]
  2. scanf("%c",&c[3]); //輸入一個字元,儲存到元素c[3]對應的地址空間中
  3. printf("%c",c[1]); //輸出元素c[1]中的字元值

如果每次輸出一個字元,可使用迴圈語句輸出字元陣列中儲存的字串,參考程式碼如下。

 
  1. int i;
  2. for(i=0;c[i]!='\0';i++) //當前i號位置的字元變數只要不是結束符就輸出
  3. printf("%c",c[i]);

一維字元教組的應用舉例

C 語言中的字串總是以 '\0' 作為結束標誌,所以字串的長度指的是從字串的首字元開始,到第一次遇到 '\0' 為止,這之間所包含的有效字元的個數,結束符不計算在字串長度內。

如字串”abcd”,C 語言中字串最後一個有效字元後隱含 '\0' 字元,故該字串長度為 4。

【例 1】編寫實現求一個字串長度的程式。

分析:把字串儲存在一維字元陣列中,其長度用 len 表示,初始為 0。演算法為:從該陣列的首元素(0 號位置)開始,只要當前元素不為 '\0',len 加 1,直到遇到 '\0' 為止,此時 len 的值即為該字串的長度。

實現程式碼:

 
  1. #include<stdio.h>
  2. int main (void)
  3. {
  4. char str[]="A good book is a good friend!";
  5. int i, len=0; //len必須初始化為0
  6. for(i=0;str[i]!='\0';i++)
  7. len++;
  8. printf ("The length is: %d\n",len);
  9. return 0;
  10. }

執行結果為:
The length is: 29

【補充】該程式迴圈部分也可以使用 while 迴圈,如下所示:

 
  1. i=0;
  2. while(str[i]!='\0')
  3. {
  4. len++;
  5. i++;
  6. }