楠木軒

C/C++編程筆記:C語言字符數組初始化,有些賦值方式千萬注意

由 長孫秀芬 發佈於 經典

字符數組的初始化,最容易理解的方式就是逐個字符賦給數組中各元素。

charstr[10]={'I','','a','m','',‘h’,'a','p','p','y'};

即把10個字符分別賦給str[0]到str[9]10個元素

如果花括號中提供的字符個數大於數組長度,則按語法錯誤處理;若小於數組長度,則只將這些字符數組中前面那些元素,其餘的元素自動定為空字符(即'\0')

如char str[10] = {'\0'}; //結果裏面元素全都為\0.其實這樣賦值只是把第1個元素賦值為\0,後面的都默認用\0填充,如果是char str[10]={'1'};

只有第一個為‘1’,後面都是\0。但千萬不要以為寫成char str[10];不賦值也可以。這樣寫裏面的內容是錯的。

這是細節,值得注意。

所以我們最好每次想寫char str[5]都寫成

char str[5]='\0';

這樣做最好。

int a[10]={4,5};

第一個賦值為4,第二個為5,後面的為0.如果直接int a[10]; 內容很亂。

規律:用某個值給數組賦值,沒有被賦值的元素會自動調用默認的構造函數,如char默認為\0,int默認為0.等等.

在 c語言中,將字符串作為字符數組來處理。(c 中不是)

在實際應用中人們關心的是有效字符串的長度而不是字符數組的長度,例如,

定義一個字符數組長度為100,而實際有效字符只有40個,為了測定字符串的實際長度,C語言規定了一個“字符串結束標誌”,以字符'\0’代表。如果有一個字符串,其中第10個字符為'\0',則此字符串的有效字符為9個。也就是説,在遇到第一個字符'\0'時,表示字符串結束,由它前面的字符組成字符串。

系統對字符串常量也自動加一個'\0'作為結束符。例如"C Program”共有9個字符,但在內存中佔10個字節,最後一個字節'\0'是系統自動加上的。(通過 sizeof()函數可驗證)

了結束標誌'\0'後,字符數組的長度就顯得不那麼重要了,在程序中往往依靠檢測'\0'的位置來判定字符串是否結束,而不是根據數組的長度來決定字符串長度。當然,在定義字符數組時應估計實際字符串長度,保證數組長度始終大於字符串實際長度。(在實際字符串定義中,常常並不指定數組長度,如 char str[ ])

説明:'\n’代表 ASCII 碼為0的字符,從 ASCII碼錶中可以查到 ASCII 碼為0的字符不是一個可以顯示的字符,而是一個“空操作符”,即它什麼也不幹。用它來作為字符串結束標誌不會產生附加的操作或增加有效字符,只起一個供辨別的標誌。

對C 語言處理字符串的方法由以上的瞭解後,再對字符數組初始化的方法補充一種方法——即可以用字符串常量來初始化字符數組:

注意sizeof與strlen的不同:

char a[40]={'0'};

printf("%d",sizeof(a));//開闢的數組的總大小40*1

printf("%d",strlen(a));

輸出 40,1.

char str[ ]={"I am happy"}; 可以省略花括號,如下所示

char str[ ]="I am happy";

注意:上述這種字符數組的整體賦值只能在字符數組初始化時使用,不能用於字符數組的賦值,字符數組的賦值只能對其元素一一賦值,如:

char d[5];

d="hell";

錯誤。vs2010提示表達式d必須是可修改的左值。

這跟

int a[5]={1,2,3};

而不能

int a[5];

a={1,2,3}

數組只能在初始化的時候一次性賦值,其他時候必須要一個一個賦值。

看來數組名和指針是有區別的。

下面的賦值方法是錯誤的

char str[ ];

str="I am happy";

不是用單個字符作為初值,而是用一個字符串(注意:字符串的兩端是用雙引號“”而不是單引號‘’括起來的)作為初值。顯然,這種方法更直觀方便。(注意:數組str的長度不是10,而是11,這點請務必記住,因為字符串常量"I am happy"的最後由系統自動加上一個'\0')

因此,上面的初始化與下面的初始化等價

char str[ ]={'I',' ','a','m',' ','h','a','p','p','y','\0'};必須要人為加上一個\0,否則strlen不正確。

而不與下面的等價

char str[ ]={'I',' ','a','m',' ','h','a','p','p','y'};//strlen錯誤,後面沒有\0

前者的長度是11,後者的長度是10.

説明:字符數組並不要求它的最後一個字符為'\0',甚至可以不包含'\0',像下面這樣寫是完全合法的。

char str[5]={'C','h','i','n','a'};

可見,用兩種不同方法初始化字符數組後得到的數組長度是不同的。

對字符數組只能對各個元素賦值,不能用以下方法對字符數組賦值

char str[14];

str="I love China"; (但在字符數組初始化時可以,即 charstr[14]="I love China";)

而對字符指針變量,採用下面方法賦值:

char* a;

a="I love China";

或者是 char* a="I love China"; 都可以

對字符指針變量賦初值(初始化):

char* a="I love China";

等價於:

char* a

a="I love China";

而對於字符數組的初始化

char str[14]="I love China";

不能等價於:

char str[14];

str="I love China"; (這種不是初始化,而是賦值,而對數組這樣賦值是不對的)