一、
第一 整型數組的存放,數組最后是不加'\0'的,字符串會自動加上,因此存放字符的時候數組的大小要比實際字符的多一個
第二 整型數組 每一個單元是4個字節的,字符串是一個一個字符存放的,每個字符占一個
二,字符數組與字符串的區別
C語言中沒有專門的字符串變量,如果要將一個字符串存放在變量中,必須使用字符數組,即用一個字符型數組來存放一個字符串,數組中每一個元素存放一個字符。
<1> 定義: char c[10]
字符型與整型互相通用,因此 int c[10] 也可以定義字符數組。但由於兩種類型分配字節不同, 用整型來定義會浪費空間, 另外這樣定義實際意義也不大, 只是為了說明其合法性。
<2> 初始化:
最簡單的方法即逐個賦值: char c[10]={'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y'}; 10個字符分別賦紿c[0]到c[9]10個元素。
如果初值個數小於數組長度,則只將這些字符賦紿數組中前面的元素,其余元素自動定為空字符(即'\0')。
如char c[12]={'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y'}; 則c[10]、c[11]值都為'\0' 。
C語言中,將字符串作為字符數組來處理。一般我們用字符數組來存放字符串時,都要先確定一個足夠大的數組,而實際並用不了那么多,而我們只關心其有效位,為測定字符串實際長度,C規定了一個"字符串結束標志",以字符 '\0' 代表。如果有一個字符串,其中第10個字符為'\0',則此字符串的有效字符為9個。也就是說,在遇到字符'\0'時,表示字符串結束,由它前面的字符組成字符串。
系統對字符串常量也自動加一個'\0'作為結束符。
對於語句: pirntf("How do you do? \n"); 實際上該字符串在內存中存放時,系統自動在最后一個字符'\0'的后面加了一個'\0'作為字符串結束標志,在執行printf函數時,每輸出一個字符檢查一次,看下一個字符是否'\0'。遇'\0'就停止輸出。
可以用字符串常量來初始化字符數組。如:
char c[]={"I am happy"};
也可直接寫成:
char c[]="I am happy"; 注意此時數組的長度不是10,而是11,因為系統自動加上了'\0'結束符。
字符數組不要求最后一個字符為'\0',而為了使處理字符數組和字符串的方法一致,便於測定字符串的實際長度,能及方便在程序中處理, 在字符數組末尾也常加上一個'\0'。
<3> 字符數組的輸入輸出
(1) 逐個字符輸入輸出。用格式符"%c"輸入或輸出一個字符。
(2) 將整個字符串一次輸入或輸出。用"%S"格式符,意思是輸出字符串(String)。例如:
char c[]={"china"};
printf("%S", c);
如果一個字符數組中包含一個以上'\0',則遇第一個'\0'時輸出就結束。
(3) 若輸入字符串長度超過字符數組所定義的長度時,將造成數組下標越界,但系統對此並不報錯。
(4) 用%S格式輸入字符時,遇空格、Tab鍵和回車將自動結束輸入。
用scanf函數輸入時, 遇到空格則認為一個字符串結束。試驗如下:
#include <stdio.h>
int main()
{
char str1[5], str2[5], str3[5];
scanf("%s %s %s", str1, str2, str3);
printf("%s %s %s\n", str1, str2, str3);
return 0;
}
運行結果:
================================
how are you↙
how are you
================================
#include <stdio.h>
int main()
{
char str[13];
scanf("%s", str);
printf("%s\n", str);
return 0;
}
運行結果:
================================
how are you?↙
how
================================
由第二個程序可知,實際並未將這12個字符加上'\0'送到數組str中,而是將空格前的字符"how"送到str中,將其視為字符串處理,在其后加上'\0' 。