c語言教程ppt第7章_第1頁
c語言教程ppt第7章_第2頁
c語言教程ppt第7章_第3頁
c語言教程ppt第7章_第4頁
c語言教程ppt第7章_第5頁
已閱讀5頁,還剩75頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、7.1一維數(shù)組的定義和引用 7.2二維數(shù)組的定義和引用 7.3字符數(shù)組 習(xí)題,第7章 數(shù) 組,迄今為止,我們使用的都是屬于基本類型(整型、字符型、實型)的數(shù)據(jù),c語言還提供了構(gòu)造類型的數(shù)據(jù),它們有:數(shù)組類型、結(jié)構(gòu)體類型、共用體類型。構(gòu)造類型數(shù)據(jù)是由基本類型數(shù)據(jù)按一定規(guī)則組成的,因此有的書稱它們?yōu)椤皩?dǎo)出類型”。 本章只介紹數(shù)組。數(shù)組是有序數(shù)據(jù)的集合。數(shù)組中的每一個元素都屬于同一個數(shù)據(jù)類型。用一個統(tǒng)一的數(shù)組名和下標來唯一地確定數(shù)組中的元素。有關(guān)數(shù)組的概念和其他高級語言中介紹的是相同的,不再贅述。本章只介紹c語言中如何定義和使用數(shù)組。,7.1 一維數(shù)組的定義和引用,7.1.1 一維數(shù)組的定義 一維數(shù)

2、組的定義方式為類型說明符 數(shù)組名常量表達式; 例如: int a10; 它表示數(shù)組名為a,此數(shù)組有10個元素。 說明: (1) 數(shù)組名定名規(guī)則和變量名相同,遵循標識符定名規(guī)則。 (2) 數(shù)組名后是用方括弧括起來的常量表達式,不能用圓括弧,下面用法不對:int a(10);,(3) 常量表達式表示元素的個數(shù),即數(shù)組長度。例如,在a10中,10表示a數(shù)組有10個元素,下標從0開始,這10個元素是,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9。注意不能使用數(shù)組元素a10。 (4) 常量表達式中可以包括常量和符號常量,不能包含變量。也就是說,c不允許對數(shù)組的大小作動態(tài)定義,即數(shù)組的大小不

3、依賴于程序運行過程中變量的值。例如,下面這樣定義數(shù)組是不行的: int n; scanf(%d,,7.1.2一維數(shù)組元素的引用 數(shù)組必須先定義,然后使用。c語言規(guī)定只能逐個引用數(shù)組元素而不能一次引用整個數(shù)組。 數(shù)組元素的表示形式為數(shù)組名下標 下標可以是整型常量或整型表達式。例如: 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); 運行結(jié)果如下: 9 8 7 6 5 4 3 2 1 0 程序使a0到a9的值為09,然后按逆序輸出。,7.1.3

4、一維數(shù)組的初始化 對數(shù)組元素的初始化可以用以下方法實現(xiàn): (1) 在定義數(shù)組時對數(shù)組元素賦以初值。例如: int a10=0,1,2,3,4,5,6,7,8,9; 將數(shù)組元素的初值依次放在一對花括弧內(nèi)。經(jīng)過上面的定義和初始化之后,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個元素,但花括弧內(nèi)只提供5個初值,這表示只給前面5個元素賦初值,后5個元素值為0。,(3) 如果想使一個數(shù)組中全部元素值為0,可以寫成 int a10=0,0,0,0,0,0

5、,0,0,0,0; 不能寫成 int a10=0*10; 這是與FORTRAN語言不同的,不能給數(shù)組整體賦初值。 (4) 在對全部數(shù)組元素賦初值時,可以不指定數(shù)組長度。例如: int a5=1,2,3,4,5; 可以寫成 int a=1,2,3,4,5 在第二種寫法中,花括弧中有5個數(shù),系統(tǒng)就會據(jù)此自動定義a數(shù)組的長度為5。,但若被定義的數(shù)組長度與提供初值的個數(shù)不相同,則數(shù)組長度不能省略。例如,想定義數(shù)組長度為10,就不能省略數(shù)組長度的定義,而必須寫成 int a10=1,2,3,4,5; 只初始化前5個元素,后5個元素為0。 7.1.4 一維數(shù)組程序舉例 例7.2用數(shù)組來處理求fibonac

6、ci數(shù)列問題。 程序如下: 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); ,運行結(jié)果如下: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 if語句用來控制換行,每行輸出5個數(shù)據(jù)。 例7.3用起泡法對10個數(shù)排序(由小到大)。 起泡法的思路是:將相鄰兩個數(shù)比較,將小的調(diào)到前頭。見圖7.1。,圖7.1,圖7.2,若有6個數(shù)。第一次將8和

7、9對調(diào),第二次將第2和第3個數(shù)(9和5)對調(diào)如此共進行5次,得到854209的順序,可以看到:最大的數(shù)9已“沉底”,成為最下面一個數(shù),而小的數(shù)“上升”。最小的數(shù)0已向上“浮起”一個位置。經(jīng)第一趟(共5次)后,已得到最大的數(shù)。然后進行第二趟比較,對余下的前面5個數(shù)按上法進行比較,見圖7.2。經(jīng)過4次比較,得到次大的數(shù)8。如此進行下去??梢酝浦?,對6個數(shù)要比較5趟,才能使6個數(shù)按大小順序排列。在第一趟中要進行兩個數(shù)之間的比較共5次,在第二趟中比4次第5趟比1次。如果有n個數(shù),則要進行n-1趟比較。在第1趟比較中要進行n-1次兩兩比較,在第j趟比較中要進行n-j次兩兩比較。據(jù)此畫出流程圖(見圖7.3

8、)。根據(jù)流程圖寫出程序(今設(shè)n=10),定義數(shù)組長度為11,本例中對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); 運行情況如下: 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ù)組定義的一般形式為類型說明符 數(shù)組名常量表達式常量表達式。 例如:float a34,b510; 定義a為34(3行4列)的數(shù)組,b為510(5行10列)的數(shù)組。注意不能寫成 float a3,4,b5,10; c語言對二維數(shù)組采用這樣的定義方式,使我們可以把二維數(shù)組看作是一種特殊的一維數(shù)組:它的元素又是一個一維數(shù)組。例如,可以把a看作是一個一維數(shù)組,它有3個元素:a0、a1、,7.2 二維數(shù)組的定義和引用,a2,每個元素又是一個包含4個元素的一維數(shù)組。見圖7.4??梢园補0、a1、a2看作是3個一維數(shù)組的名字

10、。上面定義的二維數(shù)組可以理解為定義了3個一維數(shù)組,即相當于 float a04,a14,a24,圖7.5,圖7.4,此處把a0,a1,a2看作一維數(shù)組名。c語言的這種處理方法在數(shù)組初始化和用指針表示時顯得很方便,這在以后會體會到。 c語言中,二維數(shù)組中元素排列的順序是:按行存放,即在內(nèi)存中先順序存放第一行的元素,再存放第二行的元素。圖7.5表示對a34數(shù)組存放的順序。 c允許使用多維數(shù)組。有了二維數(shù)組的基礎(chǔ),再掌握多維數(shù)組是不困難的。例如,定義三維數(shù)組的方法是 float a234;,多維數(shù)組元素在內(nèi)存中的排列順序:第一維的下標變化最慢,最右邊的下標變化最快。例如,上述三維數(shù)組的元素排列順序為

11、 a000a001a002a003a010a011a012a013a020a021a022a023a100a101a102a103a110a111a112a113a120a121a122a123,7.2.2 二維數(shù)組的引用 二維數(shù)組的元素的表示形式為 數(shù)組名下標下標 如a23。下標可以是整型表達式,如a2-12*2-1。不要寫成a2,3,a2-1,2*2-1形式。 數(shù)組元素可以出現(xiàn)在表達式中,也可以被賦值,例如: b12=a23/2 在使用數(shù)組元素時,應(yīng)該注意下標值應(yīng)在已定義的數(shù)組大小的范圍內(nèi)。常出現(xiàn)的錯誤是,int a34; a34=3; 定義a為34的數(shù)組,它可用的行下標值最大為2,列下標

12、值最大為3。用a34超過了數(shù)組的范圍。 請讀者嚴格區(qū)分在定義數(shù)組時用的a34和引用元素時的a34的區(qū)別。前者a34用來定義數(shù)組的維數(shù)和各維的大小,后者a34中的3和4是下標值,a34代表某一個元素。,7.2.3 二維數(shù)組的初始化 可以用下面的方法對二維數(shù)組初始化: (1) 分行給二維數(shù)組賦初值。如 int a34=1,2,3,4,5,6,7,8,9,10,11,12; 這種賦初值方法比較直觀,把第1個花括弧內(nèi)的數(shù)據(jù)給第1行的元素,第2個花括弧內(nèi)的數(shù)據(jù)賦給第2行的元素即按行賦初值。 (2) 可以將所有數(shù)據(jù)寫在一個花括弧內(nèi),按數(shù)組排列的順序?qū)Ω髟刭x初值。如:int a34=1,2,3,4,5,6

13、,7,8,9,10,11,12;效果與前相同。但以第1種方法為好,一行對一行,界限清楚。,用第2種方法如果數(shù)據(jù)多,寫成一大片,容易遺漏,也不易檢查。 (3) 可以對部分元素賦初值。 int a34=1,5,9; 它的作用是只對各行第1列的元素賦初值,其余元素值自動為0。賦初值后數(shù)組各元素為 1 0 0 0 5 0 0 0 9 0 0 0 也可以對各行中的某一元素賦初值: int a34=1,0,6,0,0,11;,初始化后的數(shù)組元素如下: 1 0 0 0 0 6 0 0 0 0 11 0 這種方法對非0元素少時比較方便,不必將所有的0都寫出來,只需輸入少量數(shù)據(jù)。也可以只對某幾行元素賦初值: i

14、nt a34=1,5,6; 數(shù)組元素為 1 0 0 0 5 6 0 0 0 0 0 0,第3行不賦初值。也可以對第2行不賦初值: int a34=1,9; (4) 如果對全部元素都賦初值(即提供全部初始數(shù)據(jù)),則定義數(shù)組時對第一維的長度可以不指定,但第二維的長度不能省。如: int a34=1,2,3,4,5,6,7,8,9,10,11,12; 與下面的定義等價: int a4=1,2,3,4,5,6,7,8,9,10,11,12; 系統(tǒng)會根據(jù)數(shù)據(jù)總個數(shù)分配存儲空間,一共12個數(shù)據(jù),每行4列,當然可確定為3行。,在定義時也可以只對部分元素賦初值而省略第一維的長度,但應(yīng)分行賦初值。如:int a

15、4=0,0,3,0,10; 這樣的寫法,能通知編譯系統(tǒng);數(shù)組共有3行。數(shù)組各元素為 0 0 3 0 0 0 0 0 0 10 0 0 從本節(jié)的介紹中可以看到:c語言在定義數(shù)組和表示數(shù)組元素時采用a這種兩個方括弧的方式,對數(shù)組初始化時十分有用,它使概念清楚,使用方便,不易出錯。,7.2.4二維數(shù)組程序舉例 例7.4將一個二維數(shù)組行和列元素互換,存到另一個二維數(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); 運行結(jié)果如下: array a: 1 2 3 4 5 6,array b: 1 4 2 5 3 6 例7.5有一個34的矩陣,要求編程序求出其中值最大的那個元素的值,以及其所在的行號和列號。先用N-S流程圖表示算法,見圖7.6。 據(jù)此寫出以下程序:,圖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)用與其他高級語言差不多,讀者比較熟悉,因此不再贅述。,7.3.1字符數(shù)組的定義 定義方法與前面介紹的類似。例如: 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個元素。在賦值以后數(shù)組的狀態(tài)如圖7.7所示。,7.3 字符數(shù)組 用來存放字符數(shù)據(jù)的數(shù)組是字符數(shù)組。字符數(shù)組中的一個元素存放一個字符。,圖7.7 也可以用整型數(shù)值來存放字符型數(shù)據(jù),因此上面第一行也可以改用: int c10;/*合法,但浪費存儲空間*/,7.3.2 字符數(shù)組的初始化 對字符數(shù)組初始化,最容易理解的方式是逐個字符賦給數(shù)組中各元素。如:char c10=I, ,a,m, ,h,a,P,P,y;把10個字符分別賦給c0到c910個元素。 如果花括弧中提供的初值個數(shù)(即字符個數(shù))大于數(shù)組長度,則按語法錯誤處理。如果初值個數(shù)小于數(shù)組長度,則只將這些字符賦給數(shù)組中前面那些元素,其余的元素自

19、動定為空字符(即0)。如: char c10=c, ,P,r,o,g,r,a,m; 數(shù)組狀態(tài)如圖7.8所示。,圖7.8 如果提供的初值個數(shù)與預(yù)定的數(shù)組長度相同,在定義時可以省略數(shù)組長度,系統(tǒng)會自動根據(jù)初值個數(shù)確定數(shù)組長度。如: char c=I, ,a,m, ,h,a,p,p,y;,數(shù)組c的長度自動定為10。用這種方式可以不必人工去數(shù)字符的個數(shù),尤其在賦初值的字符個數(shù)較多時,比較方便。 也可以定義和初始化一個二維字符數(shù)組,如: char diamond55= , ,*, ,*, ,*, *, , , ,*, ,*, ,*, , ,*; 用它代表一個鉆石形的平面圖形,見圖7.9。完整的程序見例7

20、.7。,圖7.9,例7.6輸出一個字符串。 main() char c10=I, ,a,m, ,a, ,b,o,y; int i; for(i=0;i10;i+) printf(%c,ci); printf(n); 運行結(jié)果: I am a boy,例7.7輸出一個鉆石圖形。main() char diamond5=,*,*,*,*,*,*,*,*; int i,j; for (i=0;i5;i+) for (j=0;j5;j+) printf(%c,diamondij); printf(n); 運行結(jié)果為:,7.3.4 字符串和字符串結(jié)束標志 在c語言中,將字符串作為字符數(shù)組來存放。例7.6

21、就是用一個一維的字符數(shù)組存放一個字符串“I am a boy”中的字符。這個字符串的實際長度與數(shù)組長度相等。有時,人們關(guān)心的是有效字符串的長度而不是字符數(shù)組的長度。例如,定義一個字符數(shù)組長度為100,而實際有效字符只有40個。為了測定字符串的實際長度,c語言規(guī)定了一個“字符串結(jié)束標志”,以字符0代表。如果有一個字符串,其中第10個字符為0,則此字符串的有效字符為9個。也就是說,在遇到字符0時,表示字符串結(jié)束,由它前面的字符組成字符串。,系統(tǒng)對字符串常量也自動加一個0作為結(jié)束符。例如“c Program”共有9個字符,但在內(nèi)存中占10個字節(jié),最后一個字節(jié)0 是由系統(tǒng)自動加上的。字符串作為一維數(shù)組

22、存放在內(nèi)存中。 有了結(jié)束標志0后,字符數(shù)組的長度就顯得不那么重要了。在程序中往往依靠檢測0 的位置來判定字符串是否結(jié)束,而不是根據(jù)數(shù)組的長度來決定字符串長度。當然,在定義字符數(shù)組時應(yīng)估計實際字符串長度,保證數(shù)組長度始終大于字符串實際長度。如果在一個字符數(shù)組中先后存放多個不同長度的字符串,則應(yīng)使數(shù)組長度大于最長的字符串的長度。,說明:0代表ASCII碼為0的字符,從ASCII碼表中可以查到,ASCII碼為0的字符不是一個可以顯示的字符,而是一個“空操作符”,即它什么也不做。用它來作為字符串結(jié)束標志不會產(chǎn)生附加的操作或增加有效字符,只起一個供辨別的標志。 我們以前曾用過以下的語句: printf(

23、How do you do?n); 即輸出一個字符串。在執(zhí)行此語句時系統(tǒng)怎么知道應(yīng)該輸出到哪里為止呢?實際上,在內(nèi)存中存放時,系統(tǒng)自動在最后一個字符n的后面加了一個0作為字符串結(jié)束標志,在執(zhí)行printf函數(shù)時,每輸出一個字符檢查一次,看下一個字符是否0。遇0就停止輸出。,對c語言處理字符串的方法有以上的了解后,我們再對字符數(shù)組初始化的方法補充一種方法,可以用字符串常量來使字符數(shù)組初始化。例如char c=I am happy;也可以省略花括弧,直接寫成 char c=I am happy; 不是用單個字符作為初值,而是用一個字符串(注意字符串的兩端是用雙引號而不是單引號括起來的)作為初值。顯

24、然,這種方法直觀、方便、符合人們的習(xí)慣。數(shù)組c的長度不是10,而是11,這點務(wù)請注意。因為字符串常量的最后由系統(tǒng)加上一個0。因此,上面的初始化與下面的初始化等價。,char c =I, ,a,m, ,h,a,p,p,y,0; 而不與下面的等價: char c=I, ,a,m, ,h,a,p,p,y; 前者的長度為11,后者的長度為10。如果有char c10=china; 數(shù)組c的前5個元素為c,h,i,n,a,第6個元素為0,后4個元素為空字符。見圖7.10。,圖7.10 需要說明的是:字符數(shù)組并不要求它的最后一個字符為0,甚至可以不包含0。像以下這樣寫完全是合法的: char c5=c,h

25、,i,n,a; 是否需要加0,完全根據(jù)需要決定。但是由于系統(tǒng)對字符串常量自動加一個0。 因此,人們?yōu)榱耸固幚矸椒ㄒ恢?,便于測定字符串的實際長度,以及在程序中作相應(yīng)的處理,在字符數(shù)組也常常人為地加上一個0。如: char c6=c,h,i,n,a,0;,7.3.5字符數(shù)組的輸入輸出 字符數(shù)組的輸入輸出可以有兩種方法: (1) 逐個字符輸入輸出。用格式符“%c”輸入或輸出一個字符,如例7.6。 (2) 將整個字符串一次輸入或輸出。用“%S”格式符,意思是輸出字符串(String)。例如: char c=china; printf(%S,c); 在內(nèi)存中數(shù)組c的狀態(tài)如圖7.11所示。輸出時,遇結(jié)束符

26、0就停止輸出。輸出結(jié)果為: china china0,圖7.11 請注意: (1) 輸出字符不包括結(jié)束符0。 (2) 用“%S”格式符輸出字符串時,printf函數(shù)中的輸出項是字符數(shù)組名,而不是數(shù)組元素名。寫成下面這樣是不對的: printf(%S,c0); (3) 如果數(shù)組長度大于字符串實際長度,也只輸出到遇0結(jié)束。如char c10=china; printf(%S,c);,也只輸出“china”5個字符,而不是輸出10個字符。這就是用字符串結(jié)束標志的好處。 (4) 如果一個字符數(shù)組中包含一個以上0,則遇第一個0時輸出就結(jié)束。 可以用scanf函數(shù)輸入一個字符串。例如 scanf(%S,c

27、); scanf函數(shù)中的輸入項c是字符數(shù)組名,它應(yīng)該在先前已被定義。從鍵盤輸入的字符串應(yīng)短于已定義的字符數(shù)組的長度。例如,已定義 char c6;,從鍵盤輸入: china 系統(tǒng)自動在后面加一個0結(jié)束符。如果利用一個scanf函數(shù)輸入多個字符串,則以空格分隔。例如: char strl5,Str25,Str35; scanf(%S%S%S,Str1,Str2,Str3); 輸入數(shù)據(jù): How are you? 輸入后Str1、Str2、Str3數(shù)組狀態(tài)見圖7.12。數(shù)組中未被賦值的元素的值是不可預(yù)料的。,圖7.12 若改為 char str13; scanf(%S,Str); 如果輸入以下12

28、個字符 How are you? 實際上并不是把這12個字符加上0送到數(shù)組,Str中,而只將空格前的字符“How”送到str中,由于把“How”作為一個字符串處理,因此在其后加0。Str數(shù)組狀態(tài)見圖7.13。 需要注意:scanf函數(shù)中的輸入項是字符數(shù)組名。輸入項為字符數(shù)組名時,不要再加地址符 可以輸出數(shù)組c的起始地址2000。前面介紹的輸出字符串的方法: printf(%S,c);,實際上是這樣執(zhí)行的:按字符數(shù)組名c找到其數(shù)組起始地址,然后逐個輸出其中的字符,直到遇0為止。 由于c語言用一維字符數(shù)組存放字符串,而且允許用數(shù)組名進行輸入或輸出一個字符串,因此,也可以把一維字符數(shù)組看作相當于其他

29、語言(如BASIC)中的“字符串變量”。,7.3.6 字符串處理函數(shù) 在c的函數(shù)庫中提供了一些用來處理字符串的函數(shù),使用方便。幾乎所有版本的c都提供這些函數(shù)。下面介紹幾種常用的函數(shù)。 1. puts(字符數(shù)組) 其作用是:將一個字符串(以0結(jié)束的字符序列)輸出到終端。假如已定義Str是一個字符數(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 在輸出時將字符串結(jié)束標志0轉(zhuǎn)換成n,即輸出完字符串后換行。 2. gets(字符數(shù)組) 其作用是:從終端輸入一個字符串到字符數(shù)組,并且得到一個函數(shù)值。該函數(shù)值是字符數(shù)組的起始地址。如執(zhí)行下面的函數(shù):,gets(str) 從鍵盤輸入:computer 將輸入的字符串“computer”送給字符數(shù)組Str(請注意送給數(shù)組的共有9個字符,而不是8個字符),函數(shù)值為字符數(shù)組Str的起始地址。一般利用gets函數(shù)的目的是向字符數(shù)組輸入一個字符串,而不大關(guān)心其函數(shù)值。 注意:用Puts和gets函數(shù)只能輸入或輸出一個字符串,不能寫成puts(str1,str2)或gets(str1,s

31、tr2),3. strcat(字符數(shù)組1,字符數(shù)組2) strcat是string catenate(字符串連接)的縮寫。其作用是:連接兩個字符數(shù)組中的字符串,把字符串2接到字符串1的后面,結(jié)果放在字符數(shù)組1中,函數(shù)調(diào)用后得到一個函數(shù)值字符數(shù)組1的地址。例如: char str130=peoples republic of ; char str2=china; printf(%s,strcat(str1,str2); 輸出: peoples republic of china 連接前后的狀況見圖7.15所示。,圖7.15 說明: (1) 字符數(shù)組1必須足夠大,以便容納連接后的新字符串。本例中定

32、義Str1的長度為30,是足夠大的,如果在定義時改用Str1=PeoPles Rebuplic of;就會出問題,因長度不夠。 (2) 連接前兩個字符串的后面都有一個0,連接時將字符串1后面的0取消,只在新串最后保留一個0。,4. strcPy(字符數(shù)組1,字符串2) StrcPy是STRing coPY(字符串復(fù)制)的縮寫。它是“字符串復(fù)制函數(shù)”。作用是將字符串2復(fù)制到字符數(shù)組1中去。例如: char str110,Str2=china; StrcPy(Str1,Str2); 執(zhí)行后,Str1的狀態(tài)如圖7.16所示。,圖7.16,說明: (1) 字符數(shù)組1必須定義得足夠大,以便容納被復(fù)制的字

33、符串。字符數(shù)組1的長度不應(yīng)小于字符串2的長度。 (2) “字符數(shù)組1”必須寫成數(shù)組名形式(如Str1),“字符串2”可以是字符數(shù)組名,也可以是一個字符串常量。如Strcpy(Str1,china);作用與前相同。 (3) 復(fù)制時連同字符串后面的0一起復(fù)制到字符數(shù)組1中。 (4)不能用賦值語句將一個字符串常量或字符數(shù)組直接給一個字符數(shù)組。如下面兩行都是不合法的: Str1=china; Str2=Str1;,而只能用Strcpy函數(shù)處理。用賦值語句只能將一個字符賦給一個字符型變量或字符數(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中前面若干個字符復(fù)制到字符數(shù)組1中去。例如:Strncpy(Str1,Str2,2); 作用是將Str2中前面2個字符復(fù)制到Str1中去,取代Str1中最前面2個字符。,5. strcmp(字符串1,字符串2) Strcmo是string compare(字符串比較)的縮寫。作用是比較字符串1和字符串2。例如: Strcmp(Str1,Str2); Strcmp(china,Korea); Strcmp(Str1,beijing); 字符串比較的規(guī)則與其他語言中的規(guī)則相同,即對兩個字符串自左至右逐個字符相比(按ASCII碼值大小比較)

35、,直到出現(xiàn)不同的字符或遇到0為止。如全部字符相同,則認為相等;若出現(xiàn)不相同的字符,則以第一個不相同的字符的比較結(jié)果為準。例如:,“a”“A”,“computer”“compare”,“these”“that”,“36+54”“! 而只能用 if(StrcmP(Str1,Str2)=0)printf(“yes”); 6. strlen(字符數(shù)組) Strlen是String Lenght(字符串長度)的縮寫。它是測試字符串長度的函數(shù)。函數(shù)的值為字符串中的實際長度,不包括0在內(nèi)。如: char str10=china; printf(%d,Strlen(Str); 輸出結(jié)果不是10,也不是6,而是

36、5。也可以直接測字符串常量的長度,如Strlen(china);,7. strlwr(字符串) Strlwr是String Lowercase (字符串小寫)的縮寫。函數(shù)的作用是將字符串中大寫字母換成小寫字母。 8. struPr(字符串) Strupr是String uppercase (字符串大寫)的縮寫。函數(shù)的作用是將字符串中小寫字母換成大寫字母。 以上介紹了常用的8種字符串處理函數(shù),應(yīng)當再次強調(diào):庫函數(shù)并非c語言本身的組成部分,而是人們?yōu)槭褂梅奖愣帉憽⑻峁┐蠹沂褂玫墓埠瘮?shù)。每個系統(tǒng)提供的函數(shù)數(shù)量和函數(shù)名、函數(shù)功能都不盡相同,使用時要小心,必要時查一下庫函數(shù)手冊。當然,有一些基本的函

37、數(shù)(包括函數(shù)名和函數(shù)功能),不同的系統(tǒng)所提供的是相同的,這就為程序的通用性提供了基礎(chǔ)。,7.3.7 字符數(shù)組應(yīng)用舉例 例7.8輸入一行字符,統(tǒng)計其中有多少個單詞,單詞之間用空格分隔開。 程序如下: #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); 運行情況如下:,I

38、 am a boy. There are 4 words in the line. 程序中變量i作為循環(huán)變量,num用來統(tǒng)計單詞個數(shù),word作為判別是否單詞的標志,若word=0表示未出現(xiàn)單詞,如出現(xiàn)單詞word就置成1。算法見圖7.17所示。,圖7.17,解題的思路是這樣的:單詞的數(shù)目可以由空格出現(xiàn)的次數(shù)決定(連續(xù)的若干個空格作為出現(xiàn)一次空格;一行開頭的空格不統(tǒng)計在內(nèi))。如果測出某一個字符為非空格,而它的前面的字符是空格,則表示“新的單詞開始了” ,此時使num(單詞數(shù))累加1。如果當前字符為非空格而其前面的字符也是非空格,則意味著仍然是原來那個單詞的繼續(xù),num不應(yīng)再累加1。前面一個字符是否空格可以從word的值看出來,若word=0,則表示前一個字符是空格;如果word=1,意味著前一個字符為非空格??梢杂脠D7.18表示。,圖7.18 程序中for語句中的“循環(huán)條件”為 (c=Stringi)!=0 它的作用是先將字符數(shù)組的某一元素(一個字符)賦給字符變量c。此時賦值表達式的值就是該字符,然后再判定它是否結(jié)束符。這個“循環(huán)條件”包含了一個賦值操作和一個關(guān)系運算??梢钥吹接胒or循環(huán)可以使程序簡練。,例7.9有3個字符串,要求找出其中最大者。 今設(shè)一個二維的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論