字符數組是元素類型爲字符的數組,它既具有普通數組的一般性質,又具有某些特殊性質。
字符串常量是用雙引號包圍的字符序列。存儲字符串常量時,系統會在字符序列後自動加上'/0',標誌字符串的結束。字符串的長度定義爲字符串中的有效字符數,不包括結束標誌'/0'和雙引號。
字符串變量是以'/0'作爲結束標誌的字符數組。字符串變量用於存儲和處理字符串常量。在書中統稱爲字符串的,既可能是字符串常量也可能是存儲了字符串常量的字符串變量,即特殊的字符數組。
字符數組有兩種用法:一是當作字符的數組來使用。這時的用法與整數的數組、 實數的數組等相同,對字符數組的輸入、輸出、賦值、引用等都是針對單個的元素進行。二是更爲重要的用法即存儲、處理字符串。這時它除了可以像普通數組一樣使用外,還可以把字符串作爲一個整體進行操作。
字符數組的初始化
(1)用字符對字符數組初始化 這時把字符數組當作普通數組看待, 產生的數組不會有結束符'/0'。當數據量很大時,使用這種方法的工作量是繁重的。
例:char rat[5]={'H','E','L','L','O'};
(2)用字符串常量對字符數組初始化,這時把字符數組當作字符串變量看待。
例:char panic[6]={"HELLO");
這時存放在數組panic中的字符除了H,E,L,L,O之外還有結束標誌'/0',因此與下面的初始化等價:
char panic[6]={'H','E','L','L','O'};
注意: 第二個說明語句中有6 個字符, 因此字符數組panic 的長度是6, 而字符串"HELLO"的長度卻是5,不把'/0'計算在內。
C語言也允許在用字符串初始化時省略花括號。
char panic[]="HELLO";
如果在說明語句中指定了數組的長度,那麼其大小不得小於初始化字符串的長度。多餘的元素位置被系統自動初始化爲0。實際上'/0'就是ASCII碼爲0的字符,因此'/0'和整數0是一回事。
例:char posia[11]="string";
下面的初始化卻是錯誤的:
char neg[5]="double arrow"; /*初始化數據太多*/
3)字符數組兩種不同用法舉例
在前面已經說明,字符數組既可當作普通數組使用也可用於存儲和處理字符串.下面是對應兩種用法的例子。
例: 字符數組用法示例之一,當作普通數組。
#include<stdio.h>
#define SIZE 10
main()
{
char ary1[SIZE]={'P','L','O','T'};
char ary2[SIZE];
char ch;
int i,j;
for(i=0;i<4;i++) /*輸出數組ary1*/
printf("%c",ary1[i]);
printf("/n請輸入一行字符/n");
for(i=0;i<SIZE;i++) /*輸入數組ary2*/
{
scanf("%c",&ch);
if(ch=='/n')
break;
ary2[i]=ch;
}
printf("/n");
for(j=0;j<i;j++) /*輸出數組ary2*/
printf("%c",ary2[j]);
}
程序中爲了處理數組使用了循環,並且使用了ch,i,j等工作變量,增加了程序的負擔,而且又缺乏靈活性,故這種方法很少使用。與下面完成同樣功能的程序相比,本程序複雜多了。
例: 字符數組用法之二,當作字符串。
#include<stdio.h>
#define SIZE 10
main()
{
char ary1[SIZE]="PLOT";
char ary2[SIZE];
printf("%s/n",ary1); /*輸出數組ary1*/
printf("請輸入一行字符:/n");
scanf("%s",ary2); /*輸入數組ary2*/
printf("輸入字符串是:/n");
printf("%s",ary2); /*輸出數組ary2*/
}
程序沒有用循環,只是直接調用scanf和printf函數完成輸入輸出。程序之所以能夠自動識別出字符串有幾個字符,是因此規定了字符串必須以'/0'作爲結束, 像printf之類的函數輸出字符串時一邊檢測一邊輸出,一旦碰到'/0',便認爲字符串已經結束,之後就停止工作。這樣一來'/0'對整個字符串來說至關重要了。一旦由於某種原因字符串的'/0'被改爲別的值,字符串就無法終止,printf函數就不能正常工作了。
請注意printf和scanf函數處理字符串數組的特點。直接使用數組名作爲參數。
例:printf("%s/n",ary1);
這種直接使用數組名的用法表示把字符串數組當作一個統一整體來處理,只適用於字符串,對別的類型的數組是不能這樣用的。