c-一維字元陣列
一維字元教組的定義及初始化
一維字元陣列的定義格式為:
char 陣列名[陣列大小];
例如:
- char c[10];
該語句定義了一個一維字元陣列 c,大小為 10,即佔 10 個字元變數空間,最大可儲存長度為 9 的字串(第 10 個字元為 '0')。由於沒有顯式給每個字元變數賦值,故每個字元變數為隨機值。
可以採用單個字元逐個賦值的方式初始化,也可以使用字串初始化的方式。
採用逐個字元賦值的方式
1) 當字元個數少於陣列空間大小時,例如:
- char c[8] = {'h','e','l','l','o',};//始值個數5小於陣列空間個數8
該語句定義了含 8 個字元變數的一維字元陣列,前 5 個字元變數分別顯式初始化為 'h','e','l','l','o' 等 5 個字元,後 3 個字元變數為空字元 '\0'。其儲存形式如下。
當字元陣列中含有字串結束字元 '\0' 時,可以使用 printf 函式及格式控制符 %s,輸出該字元陣列中的字串,如下所示。
- printf ("%s”,c); //陣列名 c 為首字元 'h' 的地址或者為 &c[0]
注意:使用 printf 函式及格式控制符 %s,輸出一個字串時,輸出列表中一定為某個字元的地址,且從該字元開始的串一定有結束標誌 '\0'。該語句的功能是:從輸出列表中的該地址開始,到第一次遇到 '\0' 為止,這之間的字元全部輸出。
通常一維陣列初始化時,其第一維大小可以省略,例如:
- char c[]={'h','e','l','l','o'};
對應的陣列儲存形式如下所示。
由於該陣列中不存在 '\0' 字元,故不能使用 printf("%s",c); 輸出。
- char c[8] = {'h','e','l','l','o'};
不等價於
- char c[]={'h','e','l','l','o'};
2) 當字元個數等於陣列空間大小時,例如:
- char c[5]={'h','e','l','l','o'};//初值個數5等於陣列大小5
執行該初始化語句後,陣列的儲存形式如下所示。
- char c[5]={'h','e','l','l','o'};
等價於
- char c[]={'h','e','l','l','o'};
由於該字元陣列中不包含字串結束標誌 '\0',故不能使用 printf("%s",c); 輸出其中的字串。輸出結果中一般含有隨機亂碼。
這種情況一般採用迴圈語句逐個輸出該陣列中的每個字元。
- int i;
- for(i=0;i<5;i++) //迴圈次數為字元個數或陣列大小
- printf ("%c",c[i]);//格式控制符為%c,輸出列表中為字元變數c[i]
3) 當字元個數多於空間大小時,編譯時報錯。例如:
- char c[4] = {'h','e','l','l','o'}; //錯誤。初值個數5大於陣列大小4
採用字串初始化的方式
在 C 語言中,字串一般是指含有字串結束符 '\0' 的若干個字元的集合。而使用雙引號括起來的字串常量,預設隱含字串結束符 '\0'。例如:
- char c[12] = {"C program"}; //注意該陣列大小應足夠大
用字串對字元陣列初始化時,一般大括號可以去掉,即:
- char c[12]="C program";
該初始化語句與以下三條語句均是等價的。
- char c[12]= {'C',' ','p','r','o','g','r','a','m','\0','\0','\0'};
或者:
- char c[12] = {'C',' ','p','r','o','g','r','a','m','\0'};
或者:
- char c[12] = {'C',' ','p','r','o','g','r','a','m'};
以上等價初始化語句有一個共同特點:陣列的大小均為指定值 12。
其陣列儲存形式均如下所示。
採用字串對字元陣列進行初始化時,一般省略一維陣列空間的大小,即:
- char c[]="C program";
該陣列中除了儲存字串中的 9 個有效字元外,還自動在字串的結尾儲存 '\0' 字元。即該陣列的大小為 10。其儲存形式如下所示。
為節省空間及書寫方便,當用字串對字元陣列初始化時,一般均省略其一維的大小。
一維字元陣列的引用
字元陣列中的每一個元素都是一個字元,可以使用下標的形式來訪問陣列中的每一個字元。
例如
- char c[]="abcd";
定義了一個一維字元陣列 c,用字串常量對其初始化,該陣列大小為 5,前 4 個元素的值分別為 'a'、'b'、'c'、'd',第 5 個元素的值為 '\0'。其儲存形式如下所示。
可以使用 c[i] 引用該陣列中的每個元素,例如:
- c[2]='f'; //把'f'賦給元素c[2]
- scanf("%c",&c[3]); //輸入一個字元,儲存到元素c[3]對應的地址空間中
- printf("%c",c[1]); //輸出元素c[1]中的字元值
如果每次輸出一個字元,可使用迴圈語句輸出字元陣列中儲存的字串,參考程式碼如下。
- int i;
- for(i=0;c[i]!='\0';i++) //當前i號位置的字元變數只要不是結束符就輸出
- printf("%c",c[i]);
一維字元教組的應用舉例
C 語言中的字串總是以 '\0' 作為結束標誌,所以字串的長度指的是從字串的首字元開始,到第一次遇到 '\0' 為止,這之間所包含的有效字元的個數,結束符不計算在字串長度內。
如字串”abcd”,C 語言中字串最後一個有效字元後隱含 '\0' 字元,故該字串長度為 4。
【例 1】編寫實現求一個字串長度的程式。
分析:把字串儲存在一維字元陣列中,其長度用 len 表示,初始為 0。演算法為:從該陣列的首元素(0 號位置)開始,只要當前元素不為 '\0',len 加 1,直到遇到 '\0' 為止,此時 len 的值即為該字串的長度。
實現程式碼:
- #include<stdio.h>
- int main (void)
- {
- char str[]="A good book is a good friend!";
- int i, len=0; //len必須初始化為0
- for(i=0;str[i]!='\0';i++)
- len++;
- printf ("The length is: %d\n",len);
- return 0;
- }
執行結果為:
The length is: 29
【補充】該程式迴圈部分也可以使用 while 迴圈,如下所示:
- i=0;
- while(str[i]!='\0')
- {
- len++;
- i++;
- }