




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、7.1一維數(shù)組的定義和引用 7.2二維數(shù)組的定義和引用 7.3字符數(shù)組 習(xí)題,第7章 數(shù) 組,迄今為止,我們使用的都是屬于基本類(lèi)型(整型、字符型、實(shí)型)的數(shù)據(jù),c語(yǔ)言還提供了構(gòu)造類(lèi)型的數(shù)據(jù),它們有:數(shù)組類(lèi)型、結(jié)構(gòu)體類(lèi)型、共用體類(lèi)型。構(gòu)造類(lèi)型數(shù)據(jù)是由基本類(lèi)型數(shù)據(jù)按一定規(guī)則組成的,因此有的書(shū)稱(chēng)它們?yōu)椤皩?dǎo)出類(lèi)型”。 本章只介紹數(shù)組。數(shù)組是有序數(shù)據(jù)的集合。數(shù)組中的每一個(gè)元素都屬于同一個(gè)數(shù)據(jù)類(lèi)型。用一個(gè)統(tǒng)一的數(shù)組名和下標(biāo)來(lái)唯一地確定數(shù)組中的元素。有關(guān)數(shù)組的概念和其他高級(jí)語(yǔ)言中介紹的是相同的,不再贅述。本章只介紹c語(yǔ)言中如何定義和使用數(shù)組。,7.1 一維數(shù)組的定義和引用,7.1.1 一維數(shù)組的定義 一維數(shù)
2、組的定義方式為類(lèi)型說(shuō)明符 數(shù)組名常量表達(dá)式; 例如: int a10; 它表示數(shù)組名為a,此數(shù)組有10個(gè)元素。 說(shuō)明: (1) 數(shù)組名定名規(guī)則和變量名相同,遵循標(biāo)識(shí)符定名規(guī)則。 (2) 數(shù)組名后是用方括弧括起來(lái)的常量表達(dá)式,不能用圓括弧,下面用法不對(duì):int a(10);,(3) 常量表達(dá)式表示元素的個(gè)數(shù),即數(shù)組長(zhǎng)度。例如,在a10中,10表示a數(shù)組有10個(gè)元素,下標(biāo)從0開(kāi)始,這10個(gè)元素是,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9。注意不能使用數(shù)組元素a10。 (4) 常量表達(dá)式中可以包括常量和符號(hào)常量,不能包含變量。也就是說(shuō),c不允許對(duì)數(shù)組的大小作動(dòng)態(tài)定義,即數(shù)組的大小不
3、依賴(lài)于程序運(yùn)行過(guò)程中變量的值。例如,下面這樣定義數(shù)組是不行的: int n; scanf(%d,,7.1.2一維數(shù)組元素的引用 數(shù)組必須先定義,然后使用。c語(yǔ)言規(guī)定只能逐個(gè)引用數(shù)組元素而不能一次引用整個(gè)數(shù)組。 數(shù)組元素的表示形式為數(shù)組名下標(biāo) 下標(biāo)可以是整型常量或整型表達(dá)式。例如: a0=a5+a7-a2*3 例7.1數(shù)組元素的引用。 main() int i,a10; for (i=0; i=9;i+),ai=i; for(i=9;i=0; i-) printf(%d ,ai); 運(yùn)行結(jié)果如下: 9 8 7 6 5 4 3 2 1 0 程序使a0到a9的值為09,然后按逆序輸出。,7.1.3
4、一維數(shù)組的初始化 對(duì)數(shù)組元素的初始化可以用以下方法實(shí)現(xiàn): (1) 在定義數(shù)組時(shí)對(duì)數(shù)組元素賦以初值。例如: int a10=0,1,2,3,4,5,6,7,8,9; 將數(shù)組元素的初值依次放在一對(duì)花括弧內(nèi)。經(jīng)過(guò)上面的定義和初始化之后,a0=0,a1=1,a2=2,a3=3,a4=4,a5=5,a6=6,a7=7,a8=8,a9=9。 (2) 可以只給一部分元素賦值。例如: int a10=0,1,2,3,4; 定義a數(shù)組有10個(gè)元素,但花括弧內(nèi)只提供5個(gè)初值,這表示只給前面5個(gè)元素賦初值,后5個(gè)元素值為0。,(3) 如果想使一個(gè)數(shù)組中全部元素值為0,可以寫(xiě)成 int a10=0,0,0,0,0,0
5、,0,0,0,0; 不能寫(xiě)成 int a10=0*10; 這是與FORTRAN語(yǔ)言不同的,不能給數(shù)組整體賦初值。 (4) 在對(duì)全部數(shù)組元素賦初值時(shí),可以不指定數(shù)組長(zhǎng)度。例如: int a5=1,2,3,4,5; 可以寫(xiě)成 int a=1,2,3,4,5 在第二種寫(xiě)法中,花括弧中有5個(gè)數(shù),系統(tǒng)就會(huì)據(jù)此自動(dòng)定義a數(shù)組的長(zhǎng)度為5。,但若被定義的數(shù)組長(zhǎng)度與提供初值的個(gè)數(shù)不相同,則數(shù)組長(zhǎng)度不能省略。例如,想定義數(shù)組長(zhǎng)度為10,就不能省略數(shù)組長(zhǎng)度的定義,而必須寫(xiě)成 int a10=1,2,3,4,5; 只初始化前5個(gè)元素,后5個(gè)元素為0。 7.1.4 一維數(shù)組程序舉例 例7.2用數(shù)組來(lái)處理求fibonac
6、ci數(shù)列問(wèn)題。 程序如下: main(), int i; int f20=1,1; for(i=2;i20;i+) fi=fi-2+fi-1; for(i=0;i20;i+) if(i%5=0) printf(n); printf(%12d,fi); ,運(yùn)行結(jié)果如下: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 if語(yǔ)句用來(lái)控制換行,每行輸出5個(gè)數(shù)據(jù)。 例7.3用起泡法對(duì)10個(gè)數(shù)排序(由小到大)。 起泡法的思路是:將相鄰兩個(gè)數(shù)比較,將小的調(diào)到前頭。見(jiàn)圖7.1。,圖7.1,圖7.2,若有6個(gè)數(shù)。第一次將8和
7、9對(duì)調(diào),第二次將第2和第3個(gè)數(shù)(9和5)對(duì)調(diào)如此共進(jìn)行5次,得到854209的順序,可以看到:最大的數(shù)9已“沉底”,成為最下面一個(gè)數(shù),而小的數(shù)“上升”。最小的數(shù)0已向上“浮起”一個(gè)位置。經(jīng)第一趟(共5次)后,已得到最大的數(shù)。然后進(jìn)行第二趟比較,對(duì)余下的前面5個(gè)數(shù)按上法進(jìn)行比較,見(jiàn)圖7.2。經(jīng)過(guò)4次比較,得到次大的數(shù)8。如此進(jìn)行下去??梢酝浦瑢?duì)6個(gè)數(shù)要比較5趟,才能使6個(gè)數(shù)按大小順序排列。在第一趟中要進(jìn)行兩個(gè)數(shù)之間的比較共5次,在第二趟中比4次第5趟比1次。如果有n個(gè)數(shù),則要進(jìn)行n-1趟比較。在第1趟比較中要進(jìn)行n-1次兩兩比較,在第j趟比較中要進(jìn)行n-j次兩兩比較。據(jù)此畫(huà)出流程圖(見(jiàn)圖7.3
8、)。根據(jù)流程圖寫(xiě)出程序(今設(shè)n=10),定義數(shù)組長(zhǎng)度為11,本例中對(duì)a0不用,只用a1到a10,以符合人們的習(xí)慣。,圖7.3,main() int a11; int i,j,t; printf(input 10 numbers :n); for (i=1;iai+1),t=ai;ai=ai+1;ai+1=t; printf(the sorted numbers :n); for(i=1;i11;i+) printf(%d ,ai); 運(yùn)行情況如下: input 10 numbers: 1 0 4 8 12 65 -76 100 -45 123 the sorted numbers: -76 -
9、45 0 1 4 8 12 65 100 123,7.2.1 二維數(shù)組的定義 二維數(shù)組定義的一般形式為類(lèi)型說(shuō)明符 數(shù)組名常量表達(dá)式常量表達(dá)式。 例如:float a34,b510; 定義a為34(3行4列)的數(shù)組,b為510(5行10列)的數(shù)組。注意不能寫(xiě)成 float a3,4,b5,10; c語(yǔ)言對(duì)二維數(shù)組采用這樣的定義方式,使我們可以把二維數(shù)組看作是一種特殊的一維數(shù)組:它的元素又是一個(gè)一維數(shù)組。例如,可以把a(bǔ)看作是一個(gè)一維數(shù)組,它有3個(gè)元素:a0、a1、,7.2 二維數(shù)組的定義和引用,a2,每個(gè)元素又是一個(gè)包含4個(gè)元素的一維數(shù)組。見(jiàn)圖7.4。可以把a(bǔ)0、a1、a2看作是3個(gè)一維數(shù)組的名字
10、。上面定義的二維數(shù)組可以理解為定義了3個(gè)一維數(shù)組,即相當(dāng)于 float a04,a14,a24,圖7.5,圖7.4,此處把a(bǔ)0,a1,a2看作一維數(shù)組名。c語(yǔ)言的這種處理方法在數(shù)組初始化和用指針表示時(shí)顯得很方便,這在以后會(huì)體會(huì)到。 c語(yǔ)言中,二維數(shù)組中元素排列的順序是:按行存放,即在內(nèi)存中先順序存放第一行的元素,再存放第二行的元素。圖7.5表示對(duì)a34數(shù)組存放的順序。 c允許使用多維數(shù)組。有了二維數(shù)組的基礎(chǔ),再掌握多維數(shù)組是不困難的。例如,定義三維數(shù)組的方法是 float a234;,多維數(shù)組元素在內(nèi)存中的排列順序:第一維的下標(biāo)變化最慢,最右邊的下標(biāo)變化最快。例如,上述三維數(shù)組的元素排列順序?yàn)?/p>
11、 a000a001a002a003a010a011a012a013a020a021a022a023a100a101a102a103a110a111a112a113a120a121a122a123,7.2.2 二維數(shù)組的引用 二維數(shù)組的元素的表示形式為 數(shù)組名下標(biāo)下標(biāo) 如a23。下標(biāo)可以是整型表達(dá)式,如a2-12*2-1。不要寫(xiě)成a2,3,a2-1,2*2-1形式。 數(shù)組元素可以出現(xiàn)在表達(dá)式中,也可以被賦值,例如: b12=a23/2 在使用數(shù)組元素時(shí),應(yīng)該注意下標(biāo)值應(yīng)在已定義的數(shù)組大小的范圍內(nèi)。常出現(xiàn)的錯(cuò)誤是,int a34; a34=3; 定義a為34的數(shù)組,它可用的行下標(biāo)值最大為2,列下標(biāo)
12、值最大為3。用a34超過(guò)了數(shù)組的范圍。 請(qǐng)讀者嚴(yán)格區(qū)分在定義數(shù)組時(shí)用的a34和引用元素時(shí)的a34的區(qū)別。前者a34用來(lái)定義數(shù)組的維數(shù)和各維的大小,后者a34中的3和4是下標(biāo)值,a34代表某一個(gè)元素。,7.2.3 二維數(shù)組的初始化 可以用下面的方法對(duì)二維數(shù)組初始化: (1) 分行給二維數(shù)組賦初值。如 int a34=1,2,3,4,5,6,7,8,9,10,11,12; 這種賦初值方法比較直觀,把第1個(gè)花括弧內(nèi)的數(shù)據(jù)給第1行的元素,第2個(gè)花括弧內(nèi)的數(shù)據(jù)賦給第2行的元素即按行賦初值。 (2) 可以將所有數(shù)據(jù)寫(xiě)在一個(gè)花括弧內(nèi),按數(shù)組排列的順序?qū)Ω髟刭x初值。如:int a34=1,2,3,4,5,6
13、,7,8,9,10,11,12;效果與前相同。但以第1種方法為好,一行對(duì)一行,界限清楚。,用第2種方法如果數(shù)據(jù)多,寫(xiě)成一大片,容易遺漏,也不易檢查。 (3) 可以對(duì)部分元素賦初值。 int a34=1,5,9; 它的作用是只對(duì)各行第1列的元素賦初值,其余元素值自動(dòng)為0。賦初值后數(shù)組各元素為 1 0 0 0 5 0 0 0 9 0 0 0 也可以對(duì)各行中的某一元素賦初值: int a34=1,0,6,0,0,11;,初始化后的數(shù)組元素如下: 1 0 0 0 0 6 0 0 0 0 11 0 這種方法對(duì)非0元素少時(shí)比較方便,不必將所有的0都寫(xiě)出來(lái),只需輸入少量數(shù)據(jù)。也可以只對(duì)某幾行元素賦初值: i
14、nt a34=1,5,6; 數(shù)組元素為 1 0 0 0 5 6 0 0 0 0 0 0,第3行不賦初值。也可以對(duì)第2行不賦初值: int a34=1,9; (4) 如果對(duì)全部元素都賦初值(即提供全部初始數(shù)據(jù)),則定義數(shù)組時(shí)對(duì)第一維的長(zhǎng)度可以不指定,但第二維的長(zhǎng)度不能省。如: int a34=1,2,3,4,5,6,7,8,9,10,11,12; 與下面的定義等價(jià): int a4=1,2,3,4,5,6,7,8,9,10,11,12; 系統(tǒng)會(huì)根據(jù)數(shù)據(jù)總個(gè)數(shù)分配存儲(chǔ)空間,一共12個(gè)數(shù)據(jù),每行4列,當(dāng)然可確定為3行。,在定義時(shí)也可以只對(duì)部分元素賦初值而省略第一維的長(zhǎng)度,但應(yīng)分行賦初值。如:int a
15、4=0,0,3,0,10; 這樣的寫(xiě)法,能通知編譯系統(tǒng);數(shù)組共有3行。數(shù)組各元素為 0 0 3 0 0 0 0 0 0 10 0 0 從本節(jié)的介紹中可以看到:c語(yǔ)言在定義數(shù)組和表示數(shù)組元素時(shí)采用a這種兩個(gè)方括弧的方式,對(duì)數(shù)組初始化時(shí)十分有用,它使概念清楚,使用方便,不易出錯(cuò)。,7.2.4二維數(shù)組程序舉例 例7.4將一個(gè)二維數(shù)組行和列元素互換,存到另一個(gè)二維數(shù)組中。例如: a=1 2 3 b=1 4 4 5 6 2 5 3 6 程序如下: main() int a23=1,2,3,4,5,6; int b32,i,j;,printf(array a:n); for (i=0;i=1;i+) fo
16、r (j=0;j=2;j+) printf(%5d,aij); bji=aij; printf(n); printf(array b:n);,for (i=0;i=2,i+) for(j=0;j=1;j+) printf(%5d,bij); printf(n); 運(yùn)行結(jié)果如下: array a: 1 2 3 4 5 6,array b: 1 4 2 5 3 6 例7.5有一個(gè)34的矩陣,要求編程序求出其中值最大的那個(gè)元素的值,以及其所在的行號(hào)和列號(hào)。先用N-S流程圖表示算法,見(jiàn)圖7.6。 據(jù)此寫(xiě)出以下程序:,圖7.6,main() int i,j,row=0,colum=0,max; int
17、a34=1,2,3,4,9,8,7,6,-10,10,-5,2; max=a00; for (i=0;imax) max=aij; row=i; colum=j; ,printf(max=%d,row=%d,colum=%dn,max,row,colum); 輸出結(jié)果為: max=10,row=2,colum=1 由于數(shù)值型數(shù)組的概念和應(yīng)用與其他高級(jí)語(yǔ)言差不多,讀者比較熟悉,因此不再贅述。,7.3.1字符數(shù)組的定義 定義方法與前面介紹的類(lèi)似。例如: char c10; c0=I;c1= ;c2=a;c3=m;c4= ;c5=h;c6=a;c7=p;c8=p;c9=y; 定義c為字符數(shù)組,包含1
18、0個(gè)元素。在賦值以后數(shù)組的狀態(tài)如圖7.7所示。,7.3 字符數(shù)組 用來(lái)存放字符數(shù)據(jù)的數(shù)組是字符數(shù)組。字符數(shù)組中的一個(gè)元素存放一個(gè)字符。,圖7.7 也可以用整型數(shù)值來(lái)存放字符型數(shù)據(jù),因此上面第一行也可以改用: int c10;/*合法,但浪費(fèi)存儲(chǔ)空間*/,7.3.2 字符數(shù)組的初始化 對(duì)字符數(shù)組初始化,最容易理解的方式是逐個(gè)字符賦給數(shù)組中各元素。如:char c10=I, ,a,m, ,h,a,P,P,y;把10個(gè)字符分別賦給c0到c910個(gè)元素。 如果花括弧中提供的初值個(gè)數(shù)(即字符個(gè)數(shù))大于數(shù)組長(zhǎng)度,則按語(yǔ)法錯(cuò)誤處理。如果初值個(gè)數(shù)小于數(shù)組長(zhǎng)度,則只將這些字符賦給數(shù)組中前面那些元素,其余的元素自
19、動(dòng)定為空字符(即0)。如: char c10=c, ,P,r,o,g,r,a,m; 數(shù)組狀態(tài)如圖7.8所示。,圖7.8 如果提供的初值個(gè)數(shù)與預(yù)定的數(shù)組長(zhǎng)度相同,在定義時(shí)可以省略數(shù)組長(zhǎng)度,系統(tǒng)會(huì)自動(dòng)根據(jù)初值個(gè)數(shù)確定數(shù)組長(zhǎng)度。如: char c=I, ,a,m, ,h,a,p,p,y;,數(shù)組c的長(zhǎng)度自動(dòng)定為10。用這種方式可以不必人工去數(shù)字符的個(gè)數(shù),尤其在賦初值的字符個(gè)數(shù)較多時(shí),比較方便。 也可以定義和初始化一個(gè)二維字符數(shù)組,如: char diamond55= , ,*, ,*, ,*, *, , , ,*, ,*, ,*, , ,*; 用它代表一個(gè)鉆石形的平面圖形,見(jiàn)圖7.9。完整的程序見(jiàn)例7
20、.7。,圖7.9,例7.6輸出一個(gè)字符串。 main() char c10=I, ,a,m, ,a, ,b,o,y; int i; for(i=0;i10;i+) printf(%c,ci); printf(n); 運(yùn)行結(jié)果: I am a boy,例7.7輸出一個(gè)鉆石圖形。main() char diamond5=,*,*,*,*,*,*,*,*; int i,j; for (i=0;i5;i+) for (j=0;j5;j+) printf(%c,diamondij); printf(n); 運(yùn)行結(jié)果為:,7.3.4 字符串和字符串結(jié)束標(biāo)志 在c語(yǔ)言中,將字符串作為字符數(shù)組來(lái)存放。例7.6
21、就是用一個(gè)一維的字符數(shù)組存放一個(gè)字符串“I am a boy”中的字符。這個(gè)字符串的實(shí)際長(zhǎng)度與數(shù)組長(zhǎng)度相等。有時(shí),人們關(guān)心的是有效字符串的長(zhǎng)度而不是字符數(shù)組的長(zhǎng)度。例如,定義一個(gè)字符數(shù)組長(zhǎng)度為100,而實(shí)際有效字符只有40個(gè)。為了測(cè)定字符串的實(shí)際長(zhǎng)度,c語(yǔ)言規(guī)定了一個(gè)“字符串結(jié)束標(biāo)志”,以字符0代表。如果有一個(gè)字符串,其中第10個(gè)字符為0,則此字符串的有效字符為9個(gè)。也就是說(shuō),在遇到字符0時(shí),表示字符串結(jié)束,由它前面的字符組成字符串。,系統(tǒng)對(duì)字符串常量也自動(dòng)加一個(gè)0作為結(jié)束符。例如“c Program”共有9個(gè)字符,但在內(nèi)存中占10個(gè)字節(jié),最后一個(gè)字節(jié)0 是由系統(tǒng)自動(dòng)加上的。字符串作為一維數(shù)組
22、存放在內(nèi)存中。 有了結(jié)束標(biāo)志0后,字符數(shù)組的長(zhǎng)度就顯得不那么重要了。在程序中往往依靠檢測(cè)0 的位置來(lái)判定字符串是否結(jié)束,而不是根據(jù)數(shù)組的長(zhǎng)度來(lái)決定字符串長(zhǎng)度。當(dāng)然,在定義字符數(shù)組時(shí)應(yīng)估計(jì)實(shí)際字符串長(zhǎng)度,保證數(shù)組長(zhǎng)度始終大于字符串實(shí)際長(zhǎng)度。如果在一個(gè)字符數(shù)組中先后存放多個(gè)不同長(zhǎng)度的字符串,則應(yīng)使數(shù)組長(zhǎng)度大于最長(zhǎng)的字符串的長(zhǎng)度。,說(shuō)明:0代表ASCII碼為0的字符,從ASCII碼表中可以查到,ASCII碼為0的字符不是一個(gè)可以顯示的字符,而是一個(gè)“空操作符”,即它什么也不做。用它來(lái)作為字符串結(jié)束標(biāo)志不會(huì)產(chǎn)生附加的操作或增加有效字符,只起一個(gè)供辨別的標(biāo)志。 我們以前曾用過(guò)以下的語(yǔ)句: printf(
23、How do you do?n); 即輸出一個(gè)字符串。在執(zhí)行此語(yǔ)句時(shí)系統(tǒng)怎么知道應(yīng)該輸出到哪里為止呢?實(shí)際上,在內(nèi)存中存放時(shí),系統(tǒng)自動(dòng)在最后一個(gè)字符n的后面加了一個(gè)0作為字符串結(jié)束標(biāo)志,在執(zhí)行printf函數(shù)時(shí),每輸出一個(gè)字符檢查一次,看下一個(gè)字符是否0。遇0就停止輸出。,對(duì)c語(yǔ)言處理字符串的方法有以上的了解后,我們?cè)賹?duì)字符數(shù)組初始化的方法補(bǔ)充一種方法,可以用字符串常量來(lái)使字符數(shù)組初始化。例如char c=I am happy;也可以省略花括弧,直接寫(xiě)成 char c=I am happy; 不是用單個(gè)字符作為初值,而是用一個(gè)字符串(注意字符串的兩端是用雙引號(hào)而不是單引號(hào)括起來(lái)的)作為初值。顯
24、然,這種方法直觀、方便、符合人們的習(xí)慣。數(shù)組c的長(zhǎng)度不是10,而是11,這點(diǎn)務(wù)請(qǐng)注意。因?yàn)樽址A康淖詈笥上到y(tǒng)加上一個(gè)0。因此,上面的初始化與下面的初始化等價(jià)。,char c =I, ,a,m, ,h,a,p,p,y,0; 而不與下面的等價(jià): char c=I, ,a,m, ,h,a,p,p,y; 前者的長(zhǎng)度為11,后者的長(zhǎng)度為10。如果有char c10=china; 數(shù)組c的前5個(gè)元素為c,h,i,n,a,第6個(gè)元素為0,后4個(gè)元素為空字符。見(jiàn)圖7.10。,圖7.10 需要說(shuō)明的是:字符數(shù)組并不要求它的最后一個(gè)字符為0,甚至可以不包含0。像以下這樣寫(xiě)完全是合法的: char c5=c,h
25、,i,n,a; 是否需要加0,完全根據(jù)需要決定。但是由于系統(tǒng)對(duì)字符串常量自動(dòng)加一個(gè)0。 因此,人們?yōu)榱耸固幚矸椒ㄒ恢?,便于測(cè)定字符串的實(shí)際長(zhǎng)度,以及在程序中作相應(yīng)的處理,在字符數(shù)組也常常人為地加上一個(gè)0。如: char c6=c,h,i,n,a,0;,7.3.5字符數(shù)組的輸入輸出 字符數(shù)組的輸入輸出可以有兩種方法: (1) 逐個(gè)字符輸入輸出。用格式符“%c”輸入或輸出一個(gè)字符,如例7.6。 (2) 將整個(gè)字符串一次輸入或輸出。用“%S”格式符,意思是輸出字符串(String)。例如: char c=china; printf(%S,c); 在內(nèi)存中數(shù)組c的狀態(tài)如圖7.11所示。輸出時(shí),遇結(jié)束符
26、0就停止輸出。輸出結(jié)果為: china china0,圖7.11 請(qǐng)注意: (1) 輸出字符不包括結(jié)束符0。 (2) 用“%S”格式符輸出字符串時(shí),printf函數(shù)中的輸出項(xiàng)是字符數(shù)組名,而不是數(shù)組元素名。寫(xiě)成下面這樣是不對(duì)的: printf(%S,c0); (3) 如果數(shù)組長(zhǎng)度大于字符串實(shí)際長(zhǎng)度,也只輸出到遇0結(jié)束。如char c10=china; printf(%S,c);,也只輸出“china”5個(gè)字符,而不是輸出10個(gè)字符。這就是用字符串結(jié)束標(biāo)志的好處。 (4) 如果一個(gè)字符數(shù)組中包含一個(gè)以上0,則遇第一個(gè)0時(shí)輸出就結(jié)束。 可以用scanf函數(shù)輸入一個(gè)字符串。例如 scanf(%S,c
27、); scanf函數(shù)中的輸入項(xiàng)c是字符數(shù)組名,它應(yīng)該在先前已被定義。從鍵盤(pán)輸入的字符串應(yīng)短于已定義的字符數(shù)組的長(zhǎng)度。例如,已定義 char c6;,從鍵盤(pán)輸入: china 系統(tǒng)自動(dòng)在后面加一個(gè)0結(jié)束符。如果利用一個(gè)scanf函數(shù)輸入多個(gè)字符串,則以空格分隔。例如: char strl5,Str25,Str35; scanf(%S%S%S,Str1,Str2,Str3); 輸入數(shù)據(jù): How are you? 輸入后Str1、Str2、Str3數(shù)組狀態(tài)見(jiàn)圖7.12。數(shù)組中未被賦值的元素的值是不可預(yù)料的。,圖7.12 若改為 char str13; scanf(%S,Str); 如果輸入以下12
28、個(gè)字符 How are you? 實(shí)際上并不是把這12個(gè)字符加上0送到數(shù)組,Str中,而只將空格前的字符“How”送到str中,由于把“How”作為一個(gè)字符串處理,因此在其后加0。Str數(shù)組狀態(tài)見(jiàn)圖7.13。 需要注意:scanf函數(shù)中的輸入項(xiàng)是字符數(shù)組名。輸入項(xiàng)為字符數(shù)組名時(shí),不要再加地址符 可以輸出數(shù)組c的起始地址2000。前面介紹的輸出字符串的方法: printf(%S,c);,實(shí)際上是這樣執(zhí)行的:按字符數(shù)組名c找到其數(shù)組起始地址,然后逐個(gè)輸出其中的字符,直到遇0為止。 由于c語(yǔ)言用一維字符數(shù)組存放字符串,而且允許用數(shù)組名進(jìn)行輸入或輸出一個(gè)字符串,因此,也可以把一維字符數(shù)組看作相當(dāng)于其他
29、語(yǔ)言(如BASIC)中的“字符串變量”。,7.3.6 字符串處理函數(shù) 在c的函數(shù)庫(kù)中提供了一些用來(lái)處理字符串的函數(shù),使用方便。幾乎所有版本的c都提供這些函數(shù)。下面介紹幾種常用的函數(shù)。 1. puts(字符數(shù)組) 其作用是:將一個(gè)字符串(以0結(jié)束的字符序列)輸出到終端。假如已定義Str是一個(gè)字符數(shù)組名,且該數(shù)組已被初始化為“china”。則執(zhí)行PutS(Str);其結(jié)果是在終端上輸出china。由于可以用printf函數(shù)輸出字符串,因此Puts函數(shù)用的不多。用Puts函數(shù)輸出的字符串中可以包含轉(zhuǎn)義字符。例如:,char str=chinanbeijing; puts(str); 輸出: chin
30、a beijing 在輸出時(shí)將字符串結(jié)束標(biāo)志0轉(zhuǎn)換成n,即輸出完字符串后換行。 2. gets(字符數(shù)組) 其作用是:從終端輸入一個(gè)字符串到字符數(shù)組,并且得到一個(gè)函數(shù)值。該函數(shù)值是字符數(shù)組的起始地址。如執(zhí)行下面的函數(shù):,gets(str) 從鍵盤(pán)輸入:computer 將輸入的字符串“computer”送給字符數(shù)組Str(請(qǐng)注意送給數(shù)組的共有9個(gè)字符,而不是8個(gè)字符),函數(shù)值為字符數(shù)組Str的起始地址。一般利用gets函數(shù)的目的是向字符數(shù)組輸入一個(gè)字符串,而不大關(guān)心其函數(shù)值。 注意:用Puts和gets函數(shù)只能輸入或輸出一個(gè)字符串,不能寫(xiě)成puts(str1,str2)或gets(str1,s
31、tr2),3. strcat(字符數(shù)組1,字符數(shù)組2) strcat是string catenate(字符串連接)的縮寫(xiě)。其作用是:連接兩個(gè)字符數(shù)組中的字符串,把字符串2接到字符串1的后面,結(jié)果放在字符數(shù)組1中,函數(shù)調(diào)用后得到一個(gè)函數(shù)值字符數(shù)組1的地址。例如: char str130=peoples republic of ; char str2=china; printf(%s,strcat(str1,str2); 輸出: peoples republic of china 連接前后的狀況見(jiàn)圖7.15所示。,圖7.15 說(shuō)明: (1) 字符數(shù)組1必須足夠大,以便容納連接后的新字符串。本例中定
32、義Str1的長(zhǎng)度為30,是足夠大的,如果在定義時(shí)改用Str1=PeoPles Rebuplic of;就會(huì)出問(wèn)題,因長(zhǎng)度不夠。 (2) 連接前兩個(gè)字符串的后面都有一個(gè)0,連接時(shí)將字符串1后面的0取消,只在新串最后保留一個(gè)0。,4. strcPy(字符數(shù)組1,字符串2) StrcPy是STRing coPY(字符串復(fù)制)的縮寫(xiě)。它是“字符串復(fù)制函數(shù)”。作用是將字符串2復(fù)制到字符數(shù)組1中去。例如: char str110,Str2=china; StrcPy(Str1,Str2); 執(zhí)行后,Str1的狀態(tài)如圖7.16所示。,圖7.16,說(shuō)明: (1) 字符數(shù)組1必須定義得足夠大,以便容納被復(fù)制的字
33、符串。字符數(shù)組1的長(zhǎng)度不應(yīng)小于字符串2的長(zhǎng)度。 (2) “字符數(shù)組1”必須寫(xiě)成數(shù)組名形式(如Str1),“字符串2”可以是字符數(shù)組名,也可以是一個(gè)字符串常量。如Strcpy(Str1,china);作用與前相同。 (3) 復(fù)制時(shí)連同字符串后面的0一起復(fù)制到字符數(shù)組1中。 (4)不能用賦值語(yǔ)句將一個(gè)字符串常量或字符數(shù)組直接給一個(gè)字符數(shù)組。如下面兩行都是不合法的: Str1=china; Str2=Str1;,而只能用Strcpy函數(shù)處理。用賦值語(yǔ)句只能將一個(gè)字符賦給一個(gè)字符型變量或字符數(shù)組元素。如下面是合法的: char a5,c1,c2; c1=a;c2=b; a0=c;a1=h;a2=i;a
34、3=n;a4=a; (5) 可以用Strcpy函數(shù)將字符串2中前面若干個(gè)字符復(fù)制到字符數(shù)組1中去。例如:Strncpy(Str1,Str2,2); 作用是將Str2中前面2個(gè)字符復(fù)制到Str1中去,取代Str1中最前面2個(gè)字符。,5. strcmp(字符串1,字符串2) Strcmo是string compare(字符串比較)的縮寫(xiě)。作用是比較字符串1和字符串2。例如: Strcmp(Str1,Str2); Strcmp(china,Korea); Strcmp(Str1,beijing); 字符串比較的規(guī)則與其他語(yǔ)言中的規(guī)則相同,即對(duì)兩個(gè)字符串自左至右逐個(gè)字符相比(按ASCII碼值大小比較)
35、,直到出現(xiàn)不同的字符或遇到0為止。如全部字符相同,則認(rèn)為相等;若出現(xiàn)不相同的字符,則以第一個(gè)不相同的字符的比較結(jié)果為準(zhǔn)。例如:,“a”“A”,“computer”“compare”,“these”“that”,“36+54”“! 而只能用 if(StrcmP(Str1,Str2)=0)printf(“yes”); 6. strlen(字符數(shù)組) Strlen是String Lenght(字符串長(zhǎng)度)的縮寫(xiě)。它是測(cè)試字符串長(zhǎng)度的函數(shù)。函數(shù)的值為字符串中的實(shí)際長(zhǎng)度,不包括0在內(nèi)。如: char str10=china; printf(%d,Strlen(Str); 輸出結(jié)果不是10,也不是6,而是
36、5。也可以直接測(cè)字符串常量的長(zhǎng)度,如Strlen(china);,7. strlwr(字符串) Strlwr是String Lowercase (字符串小寫(xiě))的縮寫(xiě)。函數(shù)的作用是將字符串中大寫(xiě)字母換成小寫(xiě)字母。 8. struPr(字符串) Strupr是String uppercase (字符串大寫(xiě))的縮寫(xiě)。函數(shù)的作用是將字符串中小寫(xiě)字母換成大寫(xiě)字母。 以上介紹了常用的8種字符串處理函數(shù),應(yīng)當(dāng)再次強(qiáng)調(diào):庫(kù)函數(shù)并非c語(yǔ)言本身的組成部分,而是人們?yōu)槭褂梅奖愣帉?xiě)、提供大家使用的公共函數(shù)。每個(gè)系統(tǒng)提供的函數(shù)數(shù)量和函數(shù)名、函數(shù)功能都不盡相同,使用時(shí)要小心,必要時(shí)查一下庫(kù)函數(shù)手冊(cè)。當(dāng)然,有一些基本的函
37、數(shù)(包括函數(shù)名和函數(shù)功能),不同的系統(tǒng)所提供的是相同的,這就為程序的通用性提供了基礎(chǔ)。,7.3.7 字符數(shù)組應(yīng)用舉例 例7.8輸入一行字符,統(tǒng)計(jì)其中有多少個(gè)單詞,單詞之間用空格分隔開(kāi)。 程序如下: #include main() char string81; int i,num=0,word=0; char c; getS(String);,for (i=0;(c=Stringi)!=0;i+) if(c=) word=0; else if(word=0) word=1; num+; printf(There are %d wordS in the line.n,num); 運(yùn)行情況如下:,I
38、 am a boy. There are 4 words in the line. 程序中變量i作為循環(huán)變量,num用來(lái)統(tǒng)計(jì)單詞個(gè)數(shù),word作為判別是否單詞的標(biāo)志,若word=0表示未出現(xiàn)單詞,如出現(xiàn)單詞word就置成1。算法見(jiàn)圖7.17所示。,圖7.17,解題的思路是這樣的:?jiǎn)卧~的數(shù)目可以由空格出現(xiàn)的次數(shù)決定(連續(xù)的若干個(gè)空格作為出現(xiàn)一次空格;一行開(kāi)頭的空格不統(tǒng)計(jì)在內(nèi))。如果測(cè)出某一個(gè)字符為非空格,而它的前面的字符是空格,則表示“新的單詞開(kāi)始了” ,此時(shí)使num(單詞數(shù))累加1。如果當(dāng)前字符為非空格而其前面的字符也是非空格,則意味著仍然是原來(lái)那個(gè)單詞的繼續(xù),num不應(yīng)再累加1。前面一個(gè)字符是否空格可以從word的值看出來(lái),若word=0,則表示前一個(gè)字符是空格;如果word=1,意味著前一個(gè)字符為非空格??梢杂脠D7.18表示。,圖7.18 程序中for語(yǔ)句中的“循環(huán)條件”為 (c=Stringi)!=0 它的作用是先將字符數(shù)組的某一元素(一個(gè)字符)賦給字符變量c。此時(shí)賦值表達(dá)式的值就是該字符,然后再判定它是否結(jié)束符。這個(gè)“循環(huán)條件”包含了一個(gè)賦值操作和一個(gè)關(guān)系運(yùn)算。可以看到用for循環(huán)可以使程序簡(jiǎn)練。,例7.9有3個(gè)字符串,要求找出其中最大者。 今設(shè)一個(gè)二維的
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 云計(jì)算HCIP??荚囶}與參考答案
- 個(gè)人借款申請(qǐng)書(shū)范文
- 業(yè)務(wù)員年度工作計(jì)劃
- 企業(yè)弱電維護(hù)合同范本
- 三八婦女節(jié)護(hù)士愛(ài)崗敬業(yè)的演講稿
- 南通批發(fā)市場(chǎng)用電合同范本
- 醫(yī)院房子出售合同范本
- 臺(tái)球俱樂(lè)部采購(gòu)合同范本
- 南京租房陰陽(yáng)合同范例
- 區(qū)域 加盟 合同范本
- 醫(yī)院管理案例運(yùn)用PDCA降低住院患者跌倒發(fā)生率課件
- 家譜族譜宗譜樣本(唐氏家譜)
- DB32T 3699-2019 城市道路照明設(shè)施養(yǎng)護(hù)規(guī)程
- 自然辯證法概論課件:第四章馬克思主義科學(xué)技術(shù)社會(huì)論
- 2021版大象版四年級(jí)科學(xué)下冊(cè)12奇妙的植物教學(xué)課件
- 精雕JDPaint快捷鍵大全
- 山東建筑電氣與智能化疑難問(wèn)題分析與解答
- 2022年鄭州衛(wèi)生健康職業(yè)學(xué)院?jiǎn)握杏⒄Z(yǔ)模擬試題(附答案解析)
- Q∕GDW 10354-2020 智能電能表功能規(guī)范
- 土壤學(xué)習(xí)題與答案
- 數(shù)字化影像與PACS教學(xué)大綱
評(píng)論
0/150
提交評(píng)論