1
、字元陣列的定義與初始化
字元陣列的初始化,最容易理解的方式就是逐個字元賦給陣列中各元素。
char str[10]=;
即把10
個字元分別賦給
str[0]
到str[9]10
個元素如果花括號中提供的字元個數大於陣列長度,則按語法錯誤處理;若小於陣列長度,則只將這些字元陣列中前面那些元素,其餘的元素自動定為空字元(即
'\0' )。
2
、字元陣列與字串
在
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
語言處理字串的方法由以上的了解後,再對字元陣列初始化的方法補充一種方法
——即可以用字串常量來初始化字元陣列:
可以省略花括號,如下所示注意:上述這種字元陣列的整體賦值只能在字元陣列
初始化時使用
,不能用於字元陣列的賦值,字元陣列的賦值只能對其元素一一賦值,下面的賦值方法是錯誤的
char str[ ];
不是用單個字元作為初值,而是用乙個字串(注意:字串的兩端是用
雙引號「」
而不是單引號
『'括起來的)作為初值。顯然,這種方法更直觀方便。(注意
:陣列
str的長度不是
10,而是
11,這點請務必記住,因為
字串常量
的最後由系統
自動加上乙個
'\0'
)因此,上面的初始化與下面的初始化等價
char str[ ]=;
而不與下面的等價
char str[ ]=;
前者的長度是
11,後者的長度是
10.說明:字元陣列並不要求它的最後乙個字元為
'\0'
,甚至可以不包含
'\0'
,向下面這樣寫是完全合法的。
char str[5]=;
++++++++
可見,用兩種不同方法初始化字元陣列後得到的陣列長度是不同的。
結果:10 11
3
、字串的表示形式
在
c語言中,可以用兩種方法表示和存放字串:(1
)用字元陣列
存放乙個字串
char str[ ]="i love china";(2
)用字元指標
指向乙個字串
char* str="i love china";
對於第二種表示方法,有人認為
str是乙個字串變數,以為定義時把字串常量
"i love china"
直接賦給該字串變數,這是不對的。
c語言對字串常量是按字元陣列處理的,在記憶體中開闢了乙個字元陣列用來存放字串常量,程式在定義字串指標變數
str時只是把字串首位址(即
存放字串的字元陣列的首位址
)賦給str
。兩種表示方式的字串輸出都用
printf("%s\n",str);
%s表示輸出乙個字串,給出字元指標變數名
str(對於第一種表示方法,字元陣列名即是字元陣列的首位址,與第二種中的指標意義是一致的),則系統先輸出它所指向的乙個字元資料,然後自動使
str自動加
1,使之指向下乙個字元
...,如此,直到遇到字串結束識別符號
" \0 "
。4
、對使用字元指標變數和字元陣列兩種方法表示字串的討論
雖然用字元陣列和字元指標變數都能實現字串的儲存和運算,但它們二者之間是有區別的,不應混為一談。
4.1、字元陣列由若干個元素組成,每個元素放乙個字元;而字元指標變數中存放的是位址(字串
/字元陣列的首位址),絕不是將字串放到字元指標變數中(是字串首位址)
4.2、賦值方式:
對字元陣列只能對各個元素賦值,不能用以下方法對字元陣列賦值
char str[14];
str="i love china";
(但在字元陣列初始化時可以,即
char str[14]="i love china";
)而對字元指標變數,採用下面方法賦值:
char* a;
a="i love china";
或者是char* a="i love china";
都可以4.3
、對字元指標變數賦初值(初始化):
char* a="i love china";
等價於:
char* a;
a="i love china";
而對於字元陣列的初始化
char str[14]="i love china";
不能等價於:
char str[14];
str="i love china";
(這種不是初始化,而是賦值,而對陣列這樣賦值是不對的)
4.4、如果定義了乙個字元陣列,那麼它有確定的記憶體位址;而定義乙個字元指標變數時,它並未指向某個確定的字元資料,並且可以多次賦值。
5
、字串處理函式
5.1
char *strcat(char *str1,const char *2 );
char *strcat(char *strdestination,const char *strsource );
功能:函式將字串
str2
連線到str1
的末端,並返回指標
str1
注:連線前兩個字串的後面都有乙個
' \0 '
,連線時將字串
1後面的
' \0 『
去掉,只在新串最後保留乙個
' \0 『
5.2char *strcpy(char *str1,const char *2 );
char *strcpy(char *strdestination,const char *strsource );
功能:複製字串
strsource
中的字元到字串
strdestination
,包括空值結束符。返回值為指標
strdestination。注:
1、「字元陣列
1」必須寫成陣列名形式,
「字串
2"可以是字元陣列名,也可以是乙個字串常量
2、複製時連同字串後面的
' \0 '
一起複製到陣列1中
3、不能用賦值語句直接將乙個字串常量或者字元陣列直接賦給乙個字元陣列(同普通變數陣列是一樣的),而只能用
strcpy
函式處理。
4、可以用
strcpy
函式將字串
2中的前若干個字元複製到字元陣列
1中去。
C語言字串與字元陣列
通俗的講字串是由一串字元組成,例如 hello world n 即是乙個字串。c 語言中沒有真正意義上的字串型別,字串由字元陣列或者字串常量來表示。const char p hello world n 上述示例中 hello world n 即是乙個字串常量,該常量由乙個字元型別指標儲存其實際位址。...
C語言 字元陣列與字串的使用詳解
1 字元陣列的定義與初始化 字元陣列的初始化,最容易理解的方式就是逐個字元賦給陣列中各元素。char str 10 即把10個字元分別賦給str 0 到str 9 10個元素 如果花括號中提供的字元個數大於陣列長度,則按語法錯誤處理 若小於陣列長度,則只將這些字元陣列中前面那些元素,其餘的元素自動定...
c語言字元陣列與字串的使用詳解
1 字元陣列的定義與初始化 字元陣列的初始化,最容易理解的方式就是逐個字元賦給陣列中各元素。char str 10 即把10個字元分別賦給str 0 到str 9 10個元素 如果花括號中提供的字元個數大於陣列長度,則按語法錯誤處理 若小於陣列長度,則只將這些字元陣列中前面那些元素,其餘的元素自動定...