《C語言程序設(shè)計(jì)》第6章 數(shù)組寫字字帖_第1頁
《C語言程序設(shè)計(jì)》第6章 數(shù)組寫字字帖_第2頁
《C語言程序設(shè)計(jì)》第6章 數(shù)組寫字字帖_第3頁
《C語言程序設(shè)計(jì)》第6章 數(shù)組寫字字帖_第4頁
《C語言程序設(shè)計(jì)》第6章 數(shù)組寫字字帖_第5頁
已閱讀5頁,還剩88頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第6章數(shù)組第6章數(shù)組學(xué)習(xí)目標(biāo)本章主要介紹一維數(shù)組、二維數(shù)組及字符數(shù)組的定義、引用、初始化和應(yīng)用,并介紹了字符串的定義和相關(guān)字符串處理函數(shù)。通過本章的學(xué)習(xí),需要掌握一維數(shù)組、二維數(shù)組、字符數(shù)組的定義、引用、初始化和應(yīng)用,掌握字符串的定義,熟悉主要的字符串處理函數(shù)。第6章數(shù)組C語言中除了支持基本類型(如整型、浮點(diǎn)型、字符型)的數(shù)據(jù)外,還提供構(gòu)造類型的數(shù)據(jù)。例如,對(duì)某班學(xué)生成績進(jìn)行排序、求某單位職工的平均工資等,由于人數(shù)眾多,如果用基本類型的簡單變量來實(shí)現(xiàn),就需要定義許多的變量來保存數(shù)據(jù),解決起來十分繁瑣。第6章數(shù)組為了便于處理這類問題,C語言提供了數(shù)組數(shù)據(jù)類型。數(shù)組是一組具有相同類型的數(shù)據(jù)的有序集合,用統(tǒng)一的數(shù)組名來表示,這些數(shù)據(jù)被稱為數(shù)組元素,每一個(gè)元素用下標(biāo)來區(qū)分。數(shù)組元素又稱為下標(biāo)變量,而以前的變量稱為簡單變量。數(shù)組元素可以與簡單變量一樣賦值、輸入輸出和進(jìn)行運(yùn)算;另一方面,由于數(shù)組元素存儲(chǔ)單元連續(xù)、下標(biāo)有序,可以通過下標(biāo)訪問數(shù)組元素。第6章數(shù)組只有一個(gè)下標(biāo)的數(shù)組被稱為一維數(shù)組,有兩個(gè)下標(biāo)的數(shù)組被稱為二維數(shù)組,依此類推。C語言允許使用任意維數(shù)的數(shù)組。在實(shí)際應(yīng)用中,當(dāng)需要處理大量同類型的數(shù)據(jù)時(shí),利用數(shù)組是很方便的。第6章數(shù)組6.1一維數(shù)組6.2二維數(shù)組6.3字符串6.1一維數(shù)組6.1.1一維數(shù)組的定義6.1.2一維數(shù)組的初始化6.1.1一維數(shù)組的定義定義一維數(shù)組的一般格式是:格式:類型說明符數(shù)組名[常量表達(dá)式];其中類型說明符是定義數(shù)組中各元素的數(shù)據(jù)類型,數(shù)組名指定數(shù)組的名字,常量表達(dá)式是說明數(shù)組的大小,即數(shù)組中元素的個(gè)數(shù)。例如:inta[10];這是定義了一個(gè)一維整型數(shù)組a,共包含10個(gè)元素(a[0]~a[9]),數(shù)組中的每一個(gè)元素均為整型。6.1.1一維數(shù)組的定義對(duì)數(shù)組定義以后,就可以在程序中引用它。在C語言中,只能逐個(gè)引用數(shù)組元素,不能一次引用數(shù)組中的全部元素。因?yàn)槭且痪S數(shù)組,所以引用數(shù)組元素時(shí)只帶一個(gè)下標(biāo)。數(shù)組元素的引用形式如下:格式:數(shù)組名[下標(biāo)表達(dá)式];例如:a[0],a[2*3],a[i](i=0~9)這些都是合法的元素引用形式。例6.1數(shù)組定義和數(shù)組元素的引用。#include<stdio.h>#defineN5voidmain(){inta[N];inti,sum=0;for(i=0;i<N;i++)a[i]=i*i;for(i=0;i<N;i++)printf("a[%d]=%d",i,a[i]);for(i=0;i<N;i++)sum+=a[i];printf("\nsum=%d\n",sum);}運(yùn)行結(jié)果:a[0]=0a[1]=1a[2]=4a[3]=9a[4]=16sum=30分析:在這個(gè)程序中,首先定義了一個(gè)長度為5的整型數(shù)組a,第1個(gè)for循環(huán)對(duì)數(shù)組元素a[0]~a[4]進(jìn)行賦值,第2個(gè)for循環(huán)按a[0]~a[4]的順序輸出各元素的值,第3個(gè)for循環(huán)對(duì)所有數(shù)組元素進(jìn)行求和,最后輸出和值。例6.2下列選項(xiàng)中,能正確定義數(shù)組的語句是(2010年3月全國計(jì)算機(jī)等級(jí)考試二級(jí)C試題選擇題第25題)A)intnum[0..2008];

B)intnum[];C)intN=2008;

intnum[N];D)#defineN2008

intnum[N];分析:在定義數(shù)組時(shí),方括號(hào)中的常量表達(dá)式用來指定元素的個(gè)數(shù),必須是正整數(shù),可以使用符號(hào)常量,但不能是變量。定義數(shù)組時(shí)如果初始化,方括號(hào)中才可以為空,否則不能為空。所以正確的定義語句是D。6.1.2一維數(shù)組的初始化在定義數(shù)組的同時(shí)就給各數(shù)組元素賦值,稱為數(shù)組的初始化。一維數(shù)組的初始化有以下幾種方式:(1)在定義數(shù)組時(shí)對(duì)全部元素初始化。例如:inta[8]={0,1,2,3,4,5,6,7};將數(shù)組元素的初值依次放在一對(duì)花括號(hào)內(nèi),并用逗號(hào)分開,系統(tǒng)會(huì)按這些數(shù)值的排列順序,從a[0]元素開始依次給數(shù)組a中的元素賦初值。經(jīng)過上面的定義和初始化,a[0]=0,a[1]=1,a[2]=2,a[3]=3,a[4]=4,a[5]=5,a[6]=6,a[7]=7。對(duì)數(shù)組元素全部賦值時(shí),可以不指定數(shù)組的長度。例如:inta[5]={1,2,3,4,5};等價(jià)于inta[]={1,2,3,4,5};(2)只給數(shù)組中的部分元素賦初值。例如:inta[10]={1,2,3,4,5};數(shù)組a有10個(gè)元素,但花括號(hào)內(nèi)只提供5個(gè)初值,這表示只給前面5個(gè)元素賦初值,系統(tǒng)自動(dòng)給后面的元素補(bǔ)0。(3)如果想使數(shù)組中全部元素值為0,可以寫成inta[10]={0};例6.3若要定義一個(gè)具有5個(gè)元素的整型數(shù)組,以下錯(cuò)誤的定義語句是(2010年9月全國計(jì)算機(jī)等級(jí)考試二級(jí)C試題選擇題第28題)A)int

a[5]={0};

B)int

b[]={0,0,0,0,0};C)int

c[2+3];

D)int

i=5,d[i];分析:在定義數(shù)組時(shí),方括號(hào)中不能是變量。所以定義錯(cuò)誤的是D。例6.4求數(shù)組元素的最大值和最小值。#include<stdio.h>voidmain(){

inta[10];

int

i,max,min;

printf("請(qǐng)輸入10個(gè)整數(shù):\n");

for(i=0;i<10;i++)

scanf("%d",&a[i]); max=a[0]; min=a[0];

for(i=1;i<10;i++)//通過循環(huán)將數(shù)組中元素依次與max和min比較

{

if(a[i]>max) max=a[i];//記錄下比max大的

if(a[i]<min) min=a[i];//記錄下比min小的

}

printf("數(shù)組中最大數(shù)為%d\n",max);

printf("數(shù)組中最小數(shù)為%d\n",min);}運(yùn)行結(jié)果:請(qǐng)輸入10個(gè)整數(shù):82724100164351632910↙數(shù)組中最大數(shù)為100數(shù)組中最小數(shù)為8分析:在本例中,首先將數(shù)組的第一個(gè)元素賦給變量max和min,作為它們的初值。然后通過循環(huán)語句將數(shù)組剩下的元素依次分別與max和min進(jìn)行比較,max保留兩者中較大的數(shù),而min保留兩者中較小的數(shù)。在比較完所有的數(shù)組元素后,max和min中保存的就是數(shù)組所有元素中最大和最小的數(shù)。例6.5對(duì)數(shù)組元素進(jìn)行排序:冒泡排序法。分析:排序方法是一種重要的、基本的算法。這里我們說說冒泡排序法的基本思路:將相鄰兩個(gè)數(shù)進(jìn)行比較,如果前一個(gè)元素大于后一個(gè)元素,則交換這兩個(gè)元素的值:即將較小的數(shù)放在前面,較大的一個(gè)數(shù)放在后面。假設(shè)定義如下數(shù)組:inta[]={11,9,17,27,15,6};

第1次先將最前面的兩個(gè)數(shù)11和9交換,第2次將第2個(gè)數(shù)和第3個(gè)數(shù)(11和17)比較,這時(shí)不用交換,如此繼續(xù)……第1輪比較完畢,得到9,11,17,15,6,27的元素順序(如圖6.1),可以看到:最大的數(shù)27已“沉底”,而小的數(shù)“上升”了。圖6.1第1輪排序過程然后進(jìn)行第2輪比較,對(duì)余下的前5個(gè)數(shù)(9,11,17,15,6)再比較,同樣使其中最大的數(shù)“沉底”。重復(fù)上述過程,對(duì)6個(gè)數(shù)總共要比較5輪。第1輪中兩數(shù)比較5次,第2輪中兩數(shù)比較4次……第5輪只須比較1次。程序如下:#include<stdio.h>voidmain(){

inta[]={11,9,17,27,15,6};

int

i,j,t;

printf("排序前的數(shù)組為:\n");

for(i=0;i<6;i++)

printf("%d",a[i]);

printf("\n");

for(j=0;j<5;j++)//5次循環(huán)實(shí)現(xiàn)5輪比較

for(i=0;i<5-j;i++)//在每一輪中進(jìn)行5-j次比較

if(a[i]>a[i+1])//相鄰兩個(gè)數(shù)比較

{t=a[i];

a[i]=a[i+1]; a[i+1]=t;}

printf("排序后的數(shù)組為:\n");

for(i=0;i<6;i++)

printf("%d",a[i]);

printf("\n");}運(yùn)行結(jié)果:排序前的數(shù)組為:1191727156排序后的數(shù)組為:6911151727例6.6以下程序運(yùn)行后的輸出結(jié)果是

。(2011年3月全國計(jì)算機(jī)等級(jí)考試二級(jí)C試題填空題第13題)

#include<stdio.h>

main()

{inti,n[5]={0};

for(i=1;i<=4;i++){n[i]=n[i-1]*2+1;printf("%d",n[i]);}printf("\n");

}分析:定義數(shù)組時(shí)初始化所有元素為0。在for循環(huán)中,n[1]~n[4]重新賦值并輸出,n[1]=n[0]*2+1=1,繼續(xù)計(jì)算,n[2]=n[1]*2+1=3,n[3]=n[2]*2+1=7,n[4]=n[3]*2+1=15,所以輸出結(jié)果是13715。例6.7有以下程序(2010年3月全國計(jì)算機(jī)等級(jí)考試二級(jí)C試題選擇題第29題)

#include<stdio.h>

main()

{inta[5]={1,2,3,4,5},b[5]={0,2,1,3,0},i,s=0;

for(i=0;i<5;i++)s=s+a[b[i]]);

printf("%d\n",s);

}程序運(yùn)行后的輸出結(jié)果是

A)6

B)10

C)11

D)15分析:首先定義數(shù)組a和b,進(jìn)入for循環(huán),當(dāng)i=0時(shí),s=s+a[b[0]]=s+a[0]=1;當(dāng)i=1時(shí),s=s+a[b[1]]=s+a[2]=1+3=4;當(dāng)i=2時(shí),s=s+a[b[2]]=s+a[1]=4+2=6;依此繼續(xù)計(jì)算,最后s=11。選C。例6.8以下程序運(yùn)行后的輸出結(jié)果是

。(2011年9月全國計(jì)算機(jī)等級(jí)考試二級(jí)C試題填空題第13題)#include<stdio.h>main(){intn[2],i,j;for(i=0;i<2;i++)n[i]=0;for(i=0;i<2;i++)for(j=0;j<2;j++)n[j]=n[i]+1;printf("%d\n",n[i]);}分析:這里的兩個(gè)for循環(huán)形成循環(huán)嵌套。當(dāng)i=0時(shí),j=0,n[0]=n[0]+1=1,j=1,n[1]=n[0]+1=2;當(dāng)i=1時(shí),j=0,n[0]=n[1]+1=3,j=1,n[1]=n[1]+1=3。執(zhí)行printf("%d\n",n[i]);時(shí),輸出的是n[1]的值,結(jié)果為

3。例6.9有以下程序(2009年9月全國計(jì)算機(jī)等級(jí)考試二級(jí)C試題選擇題第29題)#include<stdio.h>main(){inta[]={2,3,5,4},i;

for(i=0;i<4;i++)switch(i%2){case0:switch(a[i]%2){case0:a[i]++;break;case1:a[i]--;}break;case1:a[i]=0;}for(i=0;i<4;i++)printf("%d",a[i]);printf("\n");}

A)3344B)2050C)3040D)0304分析:程序進(jìn)入for循環(huán),要根據(jù)i%2的值來選擇case語句。當(dāng)i=0,i%2==0,選擇case0,則再進(jìn)入switch語句,又a[0]%2==0,則執(zhí)行a[0]++,即a[0]=3;當(dāng)i=1,i%2==1,選擇case1,則執(zhí)行a[1]=0;依此規(guī)律,求得a[2]=4,a[3]=0。選C。6.2二維數(shù)組6.2.1二維數(shù)組的定義6.2.2二維數(shù)組的初始化6.2.1二維數(shù)組的定義定義二維數(shù)組的一般格式是:格式:類型說明符數(shù)組名[常量表達(dá)式1][常量表達(dá)式2];類型說明符是指數(shù)組中每個(gè)元素的數(shù)據(jù)類型,常量表達(dá)式1表示二維數(shù)組的行數(shù),常量表達(dá)式2表示二維數(shù)組的列數(shù)。例如:inta[2][3];//定義了一個(gè)2行3列的整型數(shù)組,共6個(gè)元素6.2.1二維數(shù)組的定義各數(shù)組元素排列的邏輯結(jié)構(gòu)如圖6.2。

012a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]圖6.2二維數(shù)組的邏輯結(jié)構(gòu)

016.2.1二維數(shù)組的定義a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]圖6.3系統(tǒng)為a數(shù)組分配的內(nèi)存空間a—>a[0]a[1]6.2.1二維數(shù)組的定義引用二維數(shù)組元素時(shí)必須帶有兩個(gè)下標(biāo),引用的一般形式為:格式:數(shù)組名[行下標(biāo)表達(dá)式][列下標(biāo)表達(dá)式]其中,行下標(biāo)表達(dá)式和列下標(biāo)表達(dá)式可以是整型常量或整型表達(dá)式。例如,若有以下定義語句:inta[3][4];則a[0][1],a[1+1][3],a[i][j],a[i+1][i+k]等都是合法的引用形式。但要注意,行下標(biāo)和列下標(biāo)都不得超越數(shù)組定義的上、下界,行下標(biāo)的取值范圍是0~2,列下標(biāo)的取值范圍是0~3。6.2.2二維數(shù)組的初始化1.按行對(duì)二維數(shù)組進(jìn)行初始化。例如:inta[2][3]={{1,2,3},{4,5,6}};全部初值括在一對(duì)花括號(hào)中,每一行的初值又分別括在一對(duì)花括號(hào)中,之間用逗號(hào)隔開,即按行賦初值。賦值后數(shù)組各元素的值為:a[0][0]=1,a[0][1]=2,a[0][2]=3a[1][0]=4,a[1][1]=5,a[1][2]=6如果沒有按行用花括號(hào)分隔開,系統(tǒng)會(huì)按數(shù)組元素在內(nèi)存中的排列順序,將數(shù)據(jù)一一對(duì)應(yīng)地賦給各元素。例如:inta[2][3]={1,2,3,4,5,6};其初始化結(jié)果與前面相同。2.所賦初值個(gè)數(shù)少于數(shù)組元素個(gè)數(shù),即只對(duì)部分元素賦初值。例如:inta[2][3]={{1,2},{4,5}};則賦值以后數(shù)組中各元素的值為:a[0][0]=1,a[0][1]=2,a[0][2]=0a[1][0]=4,a[1][1]=5,a[1][2]=0也可以對(duì)部分行的部分元素賦初值,則沒有對(duì)應(yīng)賦值的數(shù)組元素自動(dòng)為0。例如:inta[3][3]={{1},{4,5}};則賦值以后數(shù)組中各元素的值為:a[0][0]=1,a[0][1]=0,a[0][2]=0a[1][0]=4,a[1][1]=5,a[1][2]=0a[2][0]=0,a[2][1]=0,a[2][2]=0又如:inta[3][3]={{1},{},{7,8}};則數(shù)組中第2行元素初值都為0,其它行一一對(duì)應(yīng)賦值。初始化結(jié)果為:a[0][0]=1,a[0][1]=0,a[0][2]=0a[1][0]=0,a[1][1]=0,a[1][2]=0a[2][0]=7,a[2][1]=8,a[2][2]=03.如果對(duì)全部元素賦初值,則定義數(shù)組時(shí)可以省略第1維的長度,但不能省略第2維的長度。例如:inta[][3]={{1,2,3},{4,5,6}};編譯系統(tǒng)根據(jù)初值的個(gè)數(shù)和第2維的長度可以計(jì)算出第1維長度為2。在按行給數(shù)組的部分元素賦初值時(shí),也可以省略第1維的長度。例如:inta[][3]={{1},{2,3},{4,5,6}};此時(shí),C編譯系統(tǒng)也會(huì)根據(jù)初值的行數(shù)確定數(shù)組的第1維長度為3。例6.10以下定義數(shù)組的語句中錯(cuò)誤的是(2011年9月全國計(jì)算機(jī)等級(jí)考試二級(jí)C試題選擇題第26題)A)intnum[]={1,2,3,4,5,6};B)intnum[][3]={{1,2},3,4,5,6};C)intnum[2][4]={{1,2},{3,4},{5,6}};D)intnum[][4]={1,2,3,4,5,6};分析:定義intnum[2][4]={{1,2},{3,4},{5,6}}時(shí),二維數(shù)組行數(shù)為2,但初始化值是按3行給出的。錯(cuò)誤的定義語句是C。例6.11

把一個(gè)二維數(shù)組的行列互換。123456

a=

142536b=

分析:把一個(gè)二維數(shù)組的行列互換即原數(shù)組的第i行上的元素成為新數(shù)組的第i列上的元素,對(duì)于數(shù)組a和數(shù)組b,只要把數(shù)組a的元素a[i][j]存放到數(shù)組b的b[j][i]元素中即可。用嵌套的for循環(huán)來實(shí)現(xiàn)此操作,

程序如下:#include<stdio.h>voidmain(){

int

i,j;

inta[2][3]={{1,2,3},{4,5,6}};

intb[3][2];

printf("Theoldarray:\n");

for(i=0;i<2;i++)//a數(shù)組中的行

{

for(j=0;j<3;j++)//a數(shù)組中的列

{ printf("%5d",a[i][j]);//輸出a數(shù)組各元素

b[j][i]=a[i][j];//將a數(shù)組元素值賦給b數(shù)組相應(yīng)元素

} printf("\n");

}

printf("Thenewarray:\n");//輸出b數(shù)組各元素

for(i=0;i<3;i++) {

for(j=0;j<2;j++)

printf("%5d",b[i][j]); printf("\n");

}運(yùn)行結(jié)果:Theoldarray:123456Thenewarray:142536例6.12從鍵盤為一個(gè)5行5列整型數(shù)組輸入數(shù)據(jù),并找出主對(duì)角線上元素的最大值及其所在的行號(hào)。分析:主對(duì)角線上的元素其行下標(biāo)和列下標(biāo)相同,通過循環(huán)來一一比較,找出其中最大值,并記下行號(hào)。

程序如下:#include<stdio.h>voidmain(){

inta[5][5],i,j,max,row;

for(i=0;i<5;i++)

for(j=0;j<5;j++)

scanf("%d",&a[i][j]); max=a[0][0]; row=0;

for(i=0;i<5;i++)

if(max<a[i][i]) { max=a[i][i]; row=i; }

printf("對(duì)角線上最大值為%d,其行號(hào)為%d\n",max,row);}運(yùn)行結(jié)果:12345678910111213141516171819202122232425對(duì)角線上最大值為25,其行號(hào)為4例6.13有以下程序(2010年3月全國計(jì)算機(jī)等級(jí)考試二級(jí)C試題填空題第11題)#include<stdio.h>

main()

{inta[3][3]={{1,2,3},{4,5,6},{7,8,9}};

intb[3]={0},i;

for(i=0;i<3;i++)b[i]=a[i][2]+a[2][i];

for(i=0;i<3;i++)printf("%d",b[i]);

printf("\n");

}程序運(yùn)行后的輸出結(jié)果是

。分析:本題首先定義了數(shù)組并初始化。進(jìn)入第1個(gè)for循環(huán),當(dāng)i=0時(shí),b[0]=a[0][2]+a[2][0]=3+7=10;當(dāng)i=1時(shí),b[1]=a[1][2]+a[2][1]=6+8=14;當(dāng)i=2時(shí),b[1]=a[2][2]+a[2][2]=9+9=18。第2個(gè)for循環(huán)輸出數(shù)組b的各元素值,所以輸出結(jié)果是101418。例6.14有以下程序(2010年3月全國計(jì)算機(jī)等級(jí)考試二級(jí)C試題選擇題第30題)

#include<stdio.h>

main()

{intb[3][3]={0,1,2,0,1,2,0,1,2},i,j,t=1;

for(i=0;i<3;i++)

for(j=i;j<=i;j++)t+=b[i][b[j][i]];

printf("%d\n",t);}程序運(yùn)行后的輸出結(jié)果是

A)1

B)3

C)4

D)9分析:本題定義了一個(gè)二維數(shù)組并初始化,接著兩個(gè)for循環(huán)形成循環(huán)的嵌套。當(dāng)i=0時(shí),且j=0,t+=b[0][b[0][0]],即t+=b[0][0],t=1;由于內(nèi)循環(huán)條件j<=0,所以本輪循環(huán)結(jié)束。當(dāng)i=1時(shí),且j=1,t+=b[1][b[1][1]],即t+=b[1][1],t=2;本輪循環(huán)結(jié)束。當(dāng)i=2時(shí),且j=2,t+=b[2][b[2][2]],即t+=b[2][2],t=4,循環(huán)結(jié)束。選C。6.3 字符串6.3.1 字符數(shù)組的定義6.3.2 字符數(shù)組的初始化6.3.3 字符數(shù)組元素的引用6.3.4 字符串和字符串結(jié)束標(biāo)志6.3.5 字符數(shù)組的輸入和輸出6.3.6 字符串處理函數(shù)6.3.1 字符數(shù)組的定義用來存放字符數(shù)據(jù)的數(shù)組是字符數(shù)組,它的每一個(gè)元素都是一個(gè)字符。同其他類型的數(shù)組一樣,字符數(shù)組既可以是一維的,也可以是多維的。一維字符數(shù)組就是元素類型為字符型的一維數(shù)組,它的定義與初始化和一維數(shù)組完全相同。一維字符數(shù)組的定義形式為:格式:char數(shù)組名[常量表達(dá)式];例如:charc[10];它定義了一個(gè)數(shù)組名為c的一維字符數(shù)組,共包含10個(gè)字符元素。二維字符數(shù)組的定義形式如下:格式:char數(shù)組名[常量表達(dá)式1][常量表達(dá)式2];例如:charch[5][5];它定義了ch是一個(gè)二維字符數(shù)組,共5行5列,有25個(gè)元素。6.3.2 字符數(shù)組的初始化字符數(shù)組可以在定義時(shí)為其元素賦初值,即字符數(shù)組的初始化。1.直接用字符常量賦初值。例如:charc[6]={'s','t','r','i','n','g'};它為數(shù)組元素賦以下初值:c[0]='s',c[1]='t',c[2]='r',c[3]='i',c[4]='n',c[5]='g'如果花括號(hào)中提供的字符個(gè)數(shù)小于數(shù)組長度,則只將這些字符賦給數(shù)組中前面那些元素,其余的元素自動(dòng)定為空字符(即'\0');如果字符個(gè)數(shù)大于數(shù)組長度,則會(huì)出現(xiàn)語法錯(cuò)誤。

例如:charc[8]={'s','t','r','i','n','g'};則c[6]='\0',c[7]='\0'。同樣的方法也可以初始化二維字符數(shù)組,例如:charch[3][5]={{'h','o','w'},{'a','r','e'},{'y','o','u','?'}};ch[0]ch[1]ch[2]how\0\0are\0\0you?\0圖6.4二維字符數(shù)組的行列結(jié)構(gòu)

2.初始化時(shí)如果省略數(shù)組長度,系統(tǒng)會(huì)自動(dòng)根據(jù)初值個(gè)數(shù)確定數(shù)組長度。例如:charc[]={'h','a','p','p','y'};數(shù)組c的長度自動(dòng)定為5。用這種方式可以不必人工去數(shù)字符的個(gè)數(shù),尤其在賦初值的字符個(gè)數(shù)較多時(shí),比較方便。例6.15下面是有關(guān)C語言字符數(shù)組的描述,其中錯(cuò)誤的是(2009年9月全國計(jì)算機(jī)等級(jí)考試二級(jí)C試題選擇題第31題)A)不可以用賦值語句給字符數(shù)組名賦字符串B)可以用輸入語句把字符串整體輸入給字符數(shù)組C)字符數(shù)組中的內(nèi)容不一定是字符串D)字符數(shù)組只能存放字符串分析:比如定義字符數(shù)組charc[6]={'s','t','r','i','n','g'},由于初始化時(shí)沒有元素賦值為'\0',所以字符數(shù)組里存放的不是字符串(字符串都以'\0'作為結(jié)束標(biāo)志)。選D。

6.3.3 字符數(shù)組元素的引用引用字符數(shù)組的一個(gè)元素,可以得到一個(gè)字符。字符數(shù)組的元素也通過下標(biāo)進(jìn)行區(qū)分,例如c[0]、c[1]、c[2]…等。例6.16對(duì)字符數(shù)組a賦'a'~'z',并輸出a數(shù)組中數(shù)據(jù)。#include<stdio.h>voidmain(){ chara[26];//定義字符數(shù)組a inti; for(i=0;i<26;i++)//通過循環(huán)對(duì)數(shù)組元素賦值

a[i]=i+'a';//從'a'開始,字符的ASCII碼逐個(gè)遞增

for(i=0;i<26;i++)//輸出字符數(shù)組各元素

printf("%c",a[i]); printf("\n");}運(yùn)行結(jié)果:abcdefghijklmnopqrstuvwxyz6.3.4 字符串和字符串結(jié)束標(biāo)志字符串常量是用雙引號(hào)括起來的一個(gè)字符序列,比如“hello”,除了組成字符串的字符外,編譯系統(tǒng)會(huì)自動(dòng)在字符串末尾添加一個(gè)隱含的串結(jié)束標(biāo)志’\0’,它在內(nèi)存中的存儲(chǔ)結(jié)構(gòu)如圖6.5。hello\0圖6.5字符串常量的存儲(chǔ)結(jié)構(gòu)C語言沒有提供“字符串”這種數(shù)據(jù)類型,但從上圖6.5可以看出,字符串元素?cái)?shù)目固定、數(shù)據(jù)類型相同(均為字符型)、依次有序排列,完全符合我們對(duì)數(shù)組的定義,所以可以把字符串看作一個(gè)字符數(shù)組,借助字符數(shù)組來處理字符串。在對(duì)字符數(shù)組初始化時(shí)可以用字符串常量進(jìn)行初始化。

例如:charc[7]={"string"};或charc[7]="string";這時(shí)元素初值為:c[0]='s',c[1]='t',c[2]='r',c[3]='i',c[4]='n',c[5]='g',c[6]='\0'。注意,因?yàn)樽址A康淖詈笥上到y(tǒng)加上了一個(gè)串結(jié)束標(biāo)志'\0',此時(shí)數(shù)組c的長度不是6,而是7。數(shù)組長度可以省略,所以上面的初始化可以等價(jià)為:charc[]={"string"};或charc[]="string";同樣也等價(jià)于charc[]={'s','t','r','i','n','g','\0'};需要特別指出的是,雖然利用字符串常量可以對(duì)字符數(shù)組進(jìn)行初始化,但不能用字符串常量為字符數(shù)組賦值。例如:charc[10]="string";//正確但下面的用法是錯(cuò)誤的:charc[10];c[10]="string";//錯(cuò)誤設(shè)有如下定義chara[10]="hello";這里字符數(shù)組a的長度為10,數(shù)組a內(nèi)存放的字符串"hello"的長度為5,但字符串中實(shí)際有6個(gè)字符,字符串末尾為結(jié)束符'\0'。例6.17有以下程序(2011年3月全國計(jì)算機(jī)等級(jí)考試二級(jí)C試題選擇題第21題)#include<stdio.h>main(){chars[]="012xy\08s34f4w2";

inti,n=0;

for(i=0;s[i]!=0;i++)

if(s[i]>='0'&&s[i]<='9')n++;

printf("%d\n",n);

}程序運(yùn)行后的輸出結(jié)果是A)0B)3C)7D)8分析:對(duì)于字符串來說,'\0'是其結(jié)束標(biāo)志,它的ASCII碼值為0。本題首先用字符串進(jìn)行初始化,然后通過for循環(huán)來依次判斷字符串中有多少個(gè)數(shù)字字符('0'~'9'),當(dāng)判斷到'\0'時(shí),根據(jù)循環(huán)條件,循環(huán)終止,所以只有'0'、'1'、'2',n=3。選B。需要補(bǔ)充說明的是,\0后面是8,不符合八進(jìn)制表示字符的規(guī)則,所以是結(jié)束符\0。大家可以思考一下,如果\0后面不是8而是7,輸出結(jié)果會(huì)是多少?例6.18以下程序用以刪除字符串所有的空格,請(qǐng)?zhí)羁铡?2010年3月全國計(jì)算機(jī)等級(jí)考試二級(jí)C試題填空題第14題)#include<stdio.h>main(){chars[100]={"OurteacherteachClanguage!"};int

i,j;

for(i=j=0;s[i]!='\0';i++)

if(s[i]!=''){s[j]=s[i];j++;}

s[j]=

printf("%s\n",s);

}分析:本題通過for循環(huán)一一判斷字符數(shù)組中各元素,如果不是空格,則仍保留在字符數(shù)組中。變量i,j分別表示原數(shù)組元素下標(biāo)和變化后的數(shù)組元素下標(biāo),最后應(yīng)在新串的末尾添加結(jié)束標(biāo)志'\0'。s[j]='\0';。6.3.5 字符數(shù)組的輸入和輸出字符數(shù)組的輸入和輸出有兩種方法,一種是對(duì)數(shù)組中的每一個(gè)字符元素逐個(gè)進(jìn)行輸入或輸出,采用"%c"格式說明符;另一種是將數(shù)組中的所有字符作為一個(gè)字符串進(jìn)行輸入或輸出,采用"%s"格式說明符。1.逐個(gè)字符輸入輸出,格式符為%c。例6.19輸入字符數(shù)組各元素值,并輸出。#include<stdio.h>voidmain(){ charc[5];

inti;

for(i=0;i<5;i++)

scanf("%c",&c[i]);//用%c格式符逐個(gè)輸入

for(i=0;i<5;i++)

printf("%c",c[i]);//用%c格式符逐個(gè)輸出}運(yùn)行結(jié)果:abcde↙abcde2.整個(gè)字符串一次輸入輸出,格式符為%s。在用格式符%s進(jìn)行輸入時(shí),其輸入項(xiàng)為數(shù)組名,由于數(shù)組名代表了該數(shù)組在內(nèi)存中的存儲(chǔ)首地址,所以輸入時(shí)不能在數(shù)組名前再加取地址符&。例如:charch[6];scanf("%s",&ch);//錯(cuò)誤scanf("%s",ch);//正確如果輸入多個(gè)字符串,相鄰兩個(gè)之間用空格分隔,系統(tǒng)會(huì)自動(dòng)在字符串最后加結(jié)束符'\0';輸出字符串時(shí),'\0'是結(jié)束標(biāo)志。例6.20用%s格式符輸入和輸出字符串。#include<stdio.h>voidmain(){ chara[6],b[6]; scanf("%s%s",a,b);//用%s輸入字符數(shù)組a和b printf("a=%s,b=%s\n",a,b);//用%s輸出字符數(shù)組a和b}運(yùn)行結(jié)果:abcdef↙a=abc,b=def分析:在輸入的"abc"與"def"之間有一個(gè)空格分隔,因此,系統(tǒng)將"abc"作為一個(gè)字符串賦給數(shù)組a,并且在后面自動(dòng)添加字符中結(jié)束標(biāo)志'\0';而將"def"作為另一個(gè)字符串賦給數(shù)組b,并且也在后面添加結(jié)束標(biāo)志'\0'。所以輸出結(jié)果為:a=abc,b=def在用格式符%s輸出時(shí),有如下幾點(diǎn)說明。例6.21有以下程序(2009年9月全國計(jì)算機(jī)等級(jí)考試二級(jí)C試題填空題第13題)#include<stdio.h>main(){chara[20]="Howareyou?",b[20];scanf("%s",b);printf("%s%s\n",a,b);}程序運(yùn)行時(shí)從鍵盤輸入:Howareyou?<回車>則輸出結(jié)果為

。分析:在用%s輸入字符串時(shí),系統(tǒng)把空格作為字符串之間的分隔符,出現(xiàn)空格則認(rèn)為該字符串輸入結(jié)束,并在其后面添加結(jié)束標(biāo)志'\0'。本題中用%s格式符輸入字符數(shù)組b,鍵盤輸入Howareyou?,由于How后面出現(xiàn)空格,所以字符數(shù)組b中存放的是How。則輸出結(jié)果為Howareyou?How

例6.22有以下程序(2011年9月全國計(jì)算機(jī)等級(jí)考試二級(jí)C試題選擇題第34題)#include<stdio.h>main(){charch[3][5]={"AAAA","BBB","CC"};printf("%s\n",ch[1]);}程序運(yùn)行后的輸出的結(jié)果是

A)AAAAB)CCC)BBBCCD)BBB分析:在用字符串初始化二維字符數(shù)組時(shí),也是按行賦值,即每一個(gè)字符串作為二維數(shù)組的一行,所以用格式符%s輸出ch[1]得到的是"BBB"。選D。6.3.6 字符串處理函數(shù)在C語言的函數(shù)庫中提供了一些用于處理字符串的函數(shù),使用方便,由于其函數(shù)原型在頭文件<string.h>中說明,所以使用時(shí)需要用#include命令將<string.h>頭文件包含到源文件中。下面介紹幾種常用的函數(shù)。1.gets函數(shù)(字符串輸入函數(shù))gets函數(shù)的調(diào)用形式為:格式:gets(str)其中str是存放輸入的字符串的首地址,通常是字符數(shù)組名、字符指針(指針相關(guān)知識(shí)將在第7章介紹)。gets函數(shù)的作用是從終端讀入一個(gè)字符串,直到讀入一個(gè)回車符為止,系統(tǒng)會(huì)自動(dòng)在字符串后加上'\0'。例如:charstr[50];gets(str);如果從鍵盤輸入:computerprogram↙則輸入的字符串會(huì)依次存放到字符數(shù)組str中,系統(tǒng)自動(dòng)在后面加上串結(jié)束符'\0'。例6.23有以下程序(2011年3月全國計(jì)算機(jī)等級(jí)考試二級(jí)C試題選擇題第31題)#include<stdio.h>main()

{chara[30],b[30];

scanf("%s",a);

gets(b);

printf("%s\n%s\n",a,b);

}程序運(yùn)行時(shí)若輸入:

howareyou?Iamfine<回車>則輸出結(jié)果是

A)howareyou?B)how

Iamfineareyou?IamfineC)howareyou?IamfineD)howareyou?分析:在用%s輸入字符串時(shí),空格是系統(tǒng)認(rèn)可的分隔符,出現(xiàn)空格則認(rèn)為該字符串輸入結(jié)束,并在其后面添加結(jié)束標(biāo)志'\0';gets()函數(shù)在讀入字符串時(shí)則以回車符作為結(jié)束標(biāo)志。本題中輸入howareyou?Iamfine,how后面有空格,所以a字符數(shù)組中存放的就是"how",其余的存放到了b字符數(shù)組中。輸出時(shí)換行,結(jié)果就是B。2.puts函數(shù)(字符串輸出函數(shù))puts函數(shù)的調(diào)用形式為:格式:puts(str)其中str是存放輸出的字符串的首地址,可以是存放字符串的字符數(shù)組名或字符串常量。puts函數(shù)的作用是將一個(gè)字符串輸出到終端。例如:charstr[]="good!";puts(str);運(yùn)行輸出:good!3.strcat函數(shù)(字符串連接函數(shù))strcat函數(shù)的調(diào)用形式為:格式:strcat(str1,str2);此函數(shù)的作用是將str2所指字符串的內(nèi)容連接到str1所指字符串的后面,結(jié)果放在字符串str1中。函數(shù)返回str1的地址值。例如:charstr1[30]="Iama";charstr2[]="student."strcat(str1,str2);則str1中的值是:Iamastudent.例6.24有以下程序(2010年9月全國計(jì)算機(jī)等級(jí)考試二級(jí)C試題選擇題第33題)#include<stdio.h>

#include<string.h>main(){chara[20]="ABCD\0EFG\0",b[]="IJK";

strcat(a,b);printf("%s\n",a);}程序運(yùn)行后的輸出結(jié)果是

A)ABCDE\OFG\OIJK

B)ABCDIJK

C)IJK

D)EFGIJK分析:'\0'是字符串的結(jié)束標(biāo)志,在字符數(shù)組a中,字符串"ABCD"后面有\(zhòng)0,系統(tǒng)認(rèn)為a字符串到這里結(jié)束,所以在它的后面連接b字符串,輸出"ABCDIJK"。選B。4.strcpy函數(shù)(字符串復(fù)制函數(shù))strcpy函數(shù)的調(diào)用形式為:格式:strcpy(str1,str2);此函數(shù)的作用是將str2所指字符串的內(nèi)容復(fù)制到str1所指的存儲(chǔ)空間中,函數(shù)返回str1的地址值。charstr1[10],str2[]="Beijing";strcpy(str1,str2);執(zhí)行后str1中的值為:Beijing5.strcmp函數(shù)(字符串比較函數(shù))strcmp函數(shù)的調(diào)用形式為:格式:strcmp(str1,str2);此函數(shù)的作用是比較字符串str1和字符串str2。其執(zhí)行規(guī)則是:自左到右逐個(gè)比較對(duì)應(yīng)字符的ASCII碼值,直到發(fā)現(xiàn)了不同字符或字符串結(jié)束符'\0',如果全部字符相同,則認(rèn)為兩個(gè)字符串相等;若出現(xiàn)不同的字符,則以第1對(duì)不相同的字符的比較結(jié)果為準(zhǔn)。函數(shù)的執(zhí)行結(jié)果如下:若字符串str1=字符串str2,則返回0。若字符串str1>字符串str2,則返回一個(gè)正整數(shù)。若字符串str1<字符串str2,則返回一個(gè)負(fù)整數(shù)。例如有如下代碼段:charstr1[]="computer";charstr2[]="compare";if(strcmp(str1,str2)>0)

printf("yes");else

printf("no");則執(zhí)行結(jié)果為:yes例6.25下列選項(xiàng)中,能夠滿足“若字符串s1等于字符串s2,則執(zhí)行ST”要求的是(2010年9月全國計(jì)算機(jī)等級(jí)考試二級(jí)C試題選擇題第31題)A)if(strcmp(s2,s1)==0)ST;B)if(sl==s2)ST;C)if(strcpy(sl,s2)==1)ST;D)if(sl-s2==0)ST;分析:比較兩個(gè)字符串應(yīng)使用函數(shù)strcmp(),不能使用數(shù)值比較符或運(yùn)算符。選A。6.strlen函數(shù)(求字符串長度函數(shù))strlen函數(shù)的調(diào)用形式為:格式

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論