字元陣列
文章推薦指數: 80 %
本例的二維字元陣列由於在初始化時全部元素都賦以初值,因此一維下標的長度可以不加以說明。
bullet_19.gif 字串和字串結束標誌. 在C語言中沒有專門的字串變數,通常 ...
高一課程>C語言>字元陣列
字元陣列
用來存放字元量的陣列稱為字元陣列。
字元陣列的定義
形式與前面介紹的數值陣列相同。
例如:
charc[10];
由於字元型和整型通用,也可以定義為int
c[10]但這時每個陣列元素占2個位元組的記憶體單元。
字元陣列也可以是二維或多維陣列。
例如:
charc[5][10];
即為二維字元陣列。
字元陣列的初始化
字元陣列也允許在定義時作初始化賦值。
例如:
charc[10]={‘c’,‘ ’,‘p’,‘r’,‘o’,‘g’,‘r’,‘a’,’m’};
賦值後各元素的值為:
陣列C c[0]的值為‘c’
c[1]的值為‘’
c[2]的值為‘p’
c[3]的值為‘r’
c[4]的值為‘0’
c[5]的值為‘g’
c[6]的值為‘r’
c[7]的值為‘a’
c[8]的值為‘m’
其中c[9]未賦值,由的值為‘p’系統自動賦予0值。
當對全體元素賦初值時也可以省去長度說明。
例如:
charc[]={`c`,`
`,`p`,`r`,`o`,`g`,`r`,`a`,`m`};
這時C陣列的長度自動定為9。
字元陣列的引用
【例1】
#include
字串和字串結束標誌
在C語言中沒有專門的字串變數,通常用一個字元陣列來存放一個字串。
前面介紹字串常量時,已說明字串總是以'\0'作為串的結束符。
因此當把一個字串存入一個陣列時,也把結束符'\0'存入陣列,並以此作為該字串是否結束的標誌。
有了'\0'標誌後,就不必再用字元陣列的長度來判斷字串的長度了。
C語言允許用字串的方式對陣列作初始化賦值。
例如:
charc[]={'c','
','p','r','o','g','r','a','m'};
可寫為:
char
c[]={"Cprogram"};
或去掉{}寫為:
char
c[]="Cprogram";
用字串方式賦值比用字元逐個賦值要多占一個位元組,用於存放字串結束標誌'\0'。
上面的陣列c在記憶體中的實際存放情況為:
C
''
p
r
o
g
r
a
m
\0
‘\0'是由C編譯系統自動加上的。
由於採用了‘\0'標誌,所以在用字串賦初值時一般無須指定陣列的長度,而由系統自行處理。
字元陣列的輸入輸出
在採用字串方式後,字元陣列的輸入輸出將變得簡單方便。
除了上述用字串賦初值的辦法外,還可用printf函數和scanf函數一次性輸出輸入一個字元陣列中的字串,而不必使用迴圈語句逐個地輸入輸出每個字元。
【例2】
#include
而在輸出表列中給出陣列名稱則可。
不能寫為:printf("%s",c[]);
【例3】
#include
應該說明的是,對一個字元陣列,如果不作初始化賦值,則必須說明陣列長度。
還應該特別注意的是,當用scanf函數輸入字串時,字串中不能含有空格,否則將以空格作為串的結束符。
例如當輸入的字串中含有空格時,運行情況為:
inputstring:
this
isabook
輸出為:
this
從輸出結果可以看出空格以後的字元都未能輸出。
為了避免這種情況,可多設幾個字元陣列分段存放含空格的串。
程式可改寫如下:
【例4】
#include
然後分別輸出這四個陣列中的字串。
在前面介紹過,scanf的各輸入項必須以位址方式出現,如&a,&b等。
但在前例中卻是以陣列名稱方式出現的,這是為什麼呢?
這是由於在C語言中規定,陣列名稱就代表了該陣列的首位址。
整個陣列是以首位址開頭的一塊連續的記憶體單元。
如有字元陣列charc[10],在記憶體可表示如圖。
C[0]
C[1]
C[2]
C[3]
C[4]
C[5]
C[6]
C[7]
C[8]
C[9]
位址 2000 2001 ..... ....... 2010
設陣列c的首位址為2000,也就是說c[0]單元位址為2000。
則陣列名稱c就代表這個首地址。
因此在c前面不能再加位址運算符&。
如寫作scanf("%s",&c);則是錯誤的。
在執行函數printf("%s",c)時,按陣列名稱c找到首位址,然後逐個輸出陣列中各個字元直到遇到字串終止標誌'\0'為止。
字串處理函數
C語言提供了豐富的字串處理函數,大致可分為字串的輸入、輸出、合併、修改、比較、轉換、複製、搜索幾類。
使用這些函數可大大減輕程式的負擔。
用於輸入輸出的字串函數,在使用前應包含頭檔
下面介紹幾個最常用的字串函數。
1. 字串輸出函數puts
格式: puts(字元陣列名稱)
功能:把字元陣列中的字串輸出到顯示器。
即在螢幕上顯示該字串。
【例5】
#include
puts函數完全可以由printf函數取代。
當需要按一定格式輸出時,通常使用printf函數。
2. 字串輸入函數gets
格式: gets (字元陣列名稱)
功能:從標準輸入設備鍵盤上輸入一個字串。
本函數得到一個函數值,即為該字元陣列的首位址。
【例5】
#include
說明gets函數並不以空格作為字串輸入結束的標誌,而只以回車作為輸入結束。
這是與scanf函數不同的。
3. 字元串連接函數strcat
格式: strcat(字元陣列名稱1,字元陣列名稱2)
功能:把字元陣列2中的字串連接到字元陣列1中字串的後面,並刪去字串1後的串標誌“\0”。
本函數返回值是字元陣列1的首位址。
【例6】
#include
要注意的是,字元陣列1應定義足夠的長度,否則不能全部裝入被連接的字串。
4.字串拷貝函數strcpy
格式: strcpy(字元陣列名稱1,字元陣列名稱2)
功能:把字元陣列2中的字串拷貝到字元陣列1中。
串結束標誌“\0”也一同拷貝。
字元數名2,也可以是一個字串常量。
這時相當於把一個字串賦予一個字元陣列。
【例7.15】
#include
5. 字串比較函數strcmp
格式: strcmp(字元陣列名稱1,字元陣列名稱2)
功能:按照ASCII碼順序比較兩個陣列中的字串,並由函數返回值返回比較結果。
字串1=字串2,返回值=0;
字串2〉字串2,返回值〉0;
字串1〈字串2,返回值〈0。
本函數也可用於比較兩個字串常量,或比較陣列和字串常量。
【例7】
#include
6. 測字串長度函數strlen
格式: strlen(字元陣列名稱)
功能:測字串的實際長度(不含字串結束標誌‘\0’)並作為函數返回值。
【例8】
#include
本題程式思路如下:五個國家名應由一個二維字元陣列來處理。
然而C語言規定可以把一個二維陣列當成多個一維陣列處理。
因此本題又可以按五個一維陣列處理,而每一個一維陣列就是一個國家名字串。
用字串比較函數比較各一維陣列的大小,並排序,輸出結果即可。
程式如下:
#include
上面說過C語言允許把一個二維陣列按多個一維陣列處理,本程式說明cs[5][20]為二維字元陣列,可分為五個一維陣列cs[0],cs[1],cs[2],cs[3],cs[4]。
因此在gets函數中使用cs[i]是合法的。
在第二個for語句中又嵌套了一個for語句組成雙重迴圈。
這個雙重迴圈完成按字母順序排序的工作。
在外層迴圈中把字元陣列cs[i]中的國名字串拷貝到陣列st中,並把下標i賦予P。
進入內層迴圈後,把st與cs[i]以後的各字串作比較,若有比st小者則把該字串拷貝到st中,並把其下標賦予p。
內迴圈完成後如p不等於i說明有比cs[i]更小的字串出現,因此交換cs[i]和st的內容。
至此已確定了陣列cs的第i號元素的排序值。
然後輸出該字串。
在外迴圈全部完成之後即完成全部排序和輸出。
延伸文章資訊
- 1二維陣列的宣告與使用
(1) int a[50][3]; // 宣告整數二維陣列a,其內容可以看成是一個棋盤表格,共有50列(橫排),每列3個元素; 例如要儲存50位同學的三科成績,就可以這樣宣告。
- 2在C/C++中將兩個二維陣列初始化為零 - 程式人生
我的問題是我們可以使用 int a[10][10] = {{0}} 初始化二維陣列嗎? 根據initialize-large-two-dimensional-array-in-c中的最高答案, ...
- 36-3 二維陣列
i 上C 語言. 6-12. 6-3 二維陣列. 二維陣列(two dimension array)表示法與一維陣列類似,是由兩個中括 ... 這也給我們一個警示,要將陣列的元素初始化。 二維陣...
- 4C 二維陣列如何初始化為0
C二維陣列如何初始化為,C 二維陣列如何初始化為0,1樓du瓶邪include using namespace std int main cout c 也可以寫int a 10 8 簡單.
- 5二維(多維)陣列
一維陣列使用陣列名稱與一個索引值來指定存取陣列元素,二維陣列使用陣列名稱與兩 ... 一維陣列在記憶體中連續配置,嚴格來說,C++ 沒有二維陣列這種東西,二維或多維 ...