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

下載本文檔

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

文檔簡介

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

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

intnum[N];D)#defineN2008

intnum[N];分析:在定義數(shù)組時,方括號中的常量表達式用來指定元素的個數(shù),必須是正整數(shù),可以使用符號常量,但不能是變量。定義數(shù)組時如果初始化,方括號中才可以為空,否則不能為空。所以正確的定義語句是D。6.1.2一維數(shù)組的初始化在定義數(shù)組的同時就給各數(shù)組元素賦值,稱為數(shù)組的初始化。一維數(shù)組的初始化有以下幾種方式:(1)在定義數(shù)組時對全部元素初始化。例如:inta[8]={0,1,2,3,4,5,6,7};將數(shù)組元素的初值依次放在一對花括號內(nèi),并用逗號分開,系統(tǒng)會按這些數(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。對數(shù)組元素全部賦值時,可以不指定數(shù)組的長度。例如:inta[5]={1,2,3,4,5};等價于inta[]={1,2,3,4,5};(2)只給數(shù)組中的部分元素賦初值。例如:inta[10]={1,2,3,4,5};數(shù)組a有10個元素,但花括號內(nèi)只提供5個初值,這表示只給前面5個元素賦初值,系統(tǒng)自動給后面的元素補0。(3)如果想使數(shù)組中全部元素值為0,可以寫成inta[10]={0};例6.3若要定義一個具有5個元素的整型數(shù)組,以下錯誤的定義語句是(2010年9月全國計算機等級考試二級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ù)組時,方括號中不能是變量。所以定義錯誤的是D。例6.4求數(shù)組元素的最大值和最小值。#include<stdio.h>voidmain(){

inta[10];

int

i,max,min;

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

第1次先將最前面的兩個數(shù)11和9交換,第2次將第2個數(shù)和第3個數(shù)(11和17)比較,這時不用交換,如此繼續(xù)……第1輪比較完畢,得到9,11,17,15,6,27的元素順序(如圖6.1),可以看到:最大的數(shù)27已“沉底”,而小的數(shù)“上升”了。圖6.1第1輪排序過程然后進行第2輪比較,對余下的前5個數(shù)(9,11,17,15,6)再比較,同樣使其中最大的數(shù)“沉底”。重復(fù)上述過程,對6個數(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)實現(xiàn)5輪比較

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

if(a[i]>a[i+1])//相鄰兩個數(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");}運行結(jié)果:排序前的數(shù)組為:1191727156排序后的數(shù)組為:6911151727例6.6以下程序運行后的輸出結(jié)果是

。(2011年3月全國計算機等級考試二級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ù)組時初始化所有元素為0。在for循環(huán)中,n[1]~n[4]重新賦值并輸出,n[1]=n[0]*2+1=1,繼續(xù)計算,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月全國計算機等級考試二級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);

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

A)6

B)10

C)11

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

。(2011年9月全國計算機等級考試二級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]);}分析:這里的兩個for循環(huán)形成循環(huán)嵌套。當(dāng)i=0時,j=0,n[0]=n[0]+1=1,j=1,n[1]=n[0]+1=2;當(dāng)i=1時,j=0,n[0]=n[1]+1=3,j=1,n[1]=n[1]+1=3。執(zhí)行printf("%d\n",n[i]);時,輸出的是n[1]的值,結(jié)果為

3。例6.9有以下程序(2009年9月全國計算機等級考試二級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分析:程序進入for循環(huán),要根據(jù)i%2的值來選擇case語句。當(dāng)i=0,i%2==0,選擇case0,則再進入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ù)組名[常量表達式1][常量表達式2];類型說明符是指數(shù)組中每個元素的數(shù)據(jù)類型,常量表達式1表示二維數(shù)組的行數(shù),常量表達式2表示二維數(shù)組的列數(shù)。例如:inta[2][3];//定義了一個2行3列的整型數(shù)組,共6個元素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ù)組名[行下標表達式][列下標表達式]其中,行下標表達式和列下標表達式可以是整型常量或整型表達式。例如,若有以下定義語句:inta[3][4];則a[0][1],a[1+1][3],a[i][j],a[i+1][i+k]等都是合法的引用形式。但要注意,行下標和列下標都不得超越數(shù)組定義的上、下界,行下標的取值范圍是0~2,列下標的取值范圍是0~3。6.2.2二維數(shù)組的初始化1.按行對二維數(shù)組進行初始化。例如:inta[2][3]={{1,2,3},{4,5,6}};全部初值括在一對花括號中,每一行的初值又分別括在一對花括號中,之間用逗號隔開,即按行賦初值。賦值后數(shù)組各元素的值為:a[0][0]=1,a[0][1]=2,a[0][2]=3a[1][0]=4,a[1][1]=5,a[1][2]=6如果沒有按行用花括號分隔開,系統(tǒng)會按數(shù)組元素在內(nèi)存中的排列順序,將數(shù)據(jù)一一對應(yīng)地賦給各元素。例如:inta[2][3]={1,2,3,4,5,6};其初始化結(jié)果與前面相同。2.所賦初值個數(shù)少于數(shù)組元素個數(shù),即只對部分元素賦初值。例如: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也可以對部分行的部分元素賦初值,則沒有對應(yīng)賦值的數(shù)組元素自動為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,其它行一一對應(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.如果對全部元素賦初值,則定義數(shù)組時可以省略第1維的長度,但不能省略第2維的長度。例如:inta[][3]={{1,2,3},{4,5,6}};編譯系統(tǒng)根據(jù)初值的個數(shù)和第2維的長度可以計算出第1維長度為2。在按行給數(shù)組的部分元素賦初值時,也可以省略第1維的長度。例如:inta[][3]={{1},{2,3},{4,5,6}};此時,C編譯系統(tǒng)也會根據(jù)初值的行數(shù)確定數(shù)組的第1維長度為3。例6.10以下定義數(shù)組的語句中錯誤的是(2011年9月全國計算機等級考試二級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ù)為2,但初始化值是按3行給出的。錯誤的定義語句是C。例6.11

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

a=

142536b=

分析:把一個二維數(shù)組的行列互換即原數(shù)組的第i行上的元素成為新數(shù)組的第i列上的元素,對于數(shù)組a和數(shù)組b,只要把數(shù)組a的元素a[i][j]存放到數(shù)組b的b[j][i]元素中即可。用嵌套的for循環(huán)來實現(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");

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

程序如下:#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("對角線上最大值為%d,其行號為%d\n",max,row);}運行結(jié)果:12345678910111213141516171819202122232425對角線上最大值為25,其行號為4例6.13有以下程序(2010年3月全國計算機等級考試二級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");

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

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

A)1

B)3

C)4

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

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

6.3.3 字符數(shù)組元素的引用引用字符數(shù)組的一個元素,可以得到一個字符。字符數(shù)組的元素也通過下標進行區(qū)分,例如c[0]、c[1]、c[2]…等。例6.16對字符數(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)對數(shù)組元素賦值

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

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

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

例如:charc[7]={"string"};或charc[7]="string";這時元素初值為:c[0]='s',c[1]='t',c[2]='r',c[3]='i',c[4]='n',c[5]='g',c[6]='\0'。注意,因為字符串常量的最后由系統(tǒng)加上了一個串結(jié)束標志'\0',此時數(shù)組c的長度不是6,而是7。數(shù)組長度可以省略,所以上面的初始化可以等價為:charc[]={"string"};或charc[]="string";同樣也等價于charc[]={'s','t','r','i','n','g','\0'};需要特別指出的是,雖然利用字符串常量可以對字符數(shù)組進行初始化,但不能用字符串常量為字符數(shù)組賦值。例如:charc[10]="string";//正確但下面的用法是錯誤的:charc[10];c[10]="string";//錯誤設(shè)有如下定義chara[10]="hello";這里字符數(shù)組a的長度為10,數(shù)組a內(nèi)存放的字符串"hello"的長度為5,但字符串中實際有6個字符,字符串末尾為結(jié)束符'\0'。例6.17有以下程序(2011年3月全國計算機等級考試二級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);

}程序運行后的輸出結(jié)果是A)0B)3C)7D)8分析:對于字符串來說,'\0'是其結(jié)束標志,它的ASCII碼值為0。本題首先用字符串進行初始化,然后通過for循環(huán)來依次判斷字符串中有多少個數(shù)字字符('0'~'9'),當(dāng)判斷到'\0'時,根據(jù)循環(huán)條件,循環(huán)終止,所以只有'0'、'1'、'2',n=3。選B。需要補充說明的是,\0后面是8,不符合八進制表示字符的規(guī)則,所以是結(jié)束符\0。大家可以思考一下,如果\0后面不是8而是7,輸出結(jié)果會是多少?例6.18以下程序用以刪除字符串所有的空格,請?zhí)羁铡?2010年3月全國計算機等級考試二級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ù)組元素下標和變化后的數(shù)組元素下標,最后應(yīng)在新串的末尾添加結(jié)束標志'\0'。s[j]='\0';。6.3.5 字符數(shù)組的輸入和輸出字符數(shù)組的輸入和輸出有兩種方法,一種是對數(shù)組中的每一個字符元素逐個進行輸入或輸出,采用"%c"格式說明符;另一種是將數(shù)組中的所有字符作為一個字符串進行輸入或輸出,采用"%s"格式說明符。1.逐個字符輸入輸出,格式符為%c。例6.19輸入字符數(shù)組各元素值,并輸出。#include<stdio.h>voidmain(){ charc[5];

inti;

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

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

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

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

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

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

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

{chara[30],b[30];

scanf("%s",a);

gets(b);

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

}程序運行時若輸入:

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

A)howareyou?B)how

Iamfineareyou?IamfineC)howareyou?IamfineD)howareyou?分析:在用%s輸入字符串時,空格是系統(tǒng)認可的分隔符,出現(xiàn)空格則認為該字符串輸入結(jié)束,并在其后面添加結(jié)束標志'\0';gets()函數(shù)在讀入字符串時則以回車符作為結(jié)束標志。本題中輸入howareyou?Iamfine,how后面有空格,所以a字符數(shù)組中存放的就是"how",其余的存放到了b字符數(shù)組中。輸出時換行,結(jié)果就是B。2.puts函數(shù)(字符串輸出函數(shù))puts函數(shù)的調(diào)用形式為:格式:puts(str)其中str是存放輸出的字符串的首地址,可以是存放字符串的字符數(shù)組名或字符串常量。puts函數(shù)的作用是將一個字符串輸出到終端。例如:charstr[]="good!";puts(str);運行輸出: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月全國計算機等級考試二級C試題選擇題第33題)#include<stdio.h>

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

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

A)ABCDE\OFG\OIJK

B)ABCDIJK

C)IJK

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

printf("yes");else

printf("no");則執(zhí)行結(jié)果為:yes例6.25下列選項中,能夠滿足“若字符串s1等于字符串s2,則執(zhí)行ST”要求的是(2010年9月全國計算機等級考試二級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;分析:比較兩個字符串應(yīng)使用函數(shù)strcmp(),不能使用數(shù)值比較符或運算符。選A。6.strlen函數(shù)(求字符串長度函數(shù))strlen函數(shù)的調(diào)用形式為:格式

溫馨提示

  • 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論