版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
數(shù)組數(shù)組概述5.1一維數(shù)組5.2二維數(shù)組5.3字符數(shù)組5.45.1數(shù)組概述在程序設(shè)計(jì)中,為了處理方便,對(duì)于一批類型相同的數(shù)據(jù),如學(xué)生成績(jī),可以利用數(shù)組來(lái)存儲(chǔ),這樣,既能從整個(gè)數(shù)組出發(fā)去處理其中的個(gè)別元素,如某一個(gè)學(xué)生的成績(jī),也能以統(tǒng)一方式處理數(shù)組的一批元素或所有元素,如部分或所有學(xué)生的成績(jī)。而后一種處理方式是由一批元素構(gòu)成的數(shù)組和一批獨(dú)立命名的變量之間的主要區(qū)別。5.1數(shù)組概述數(shù)組是C語(yǔ)言提供的一種常用的構(gòu)造數(shù)據(jù)類型。數(shù)組是數(shù)目固定,類型相同的若干變量的有序集合。在程序中,主要利用數(shù)組來(lái)處理一批類型相同的數(shù)據(jù)。每個(gè)數(shù)組都有一個(gè)名字,稱為數(shù)組名。它表示內(nèi)存中一塊連續(xù)的存儲(chǔ)區(qū)域。組成數(shù)組的變量稱為數(shù)組元素,它們可以是基本數(shù)據(jù)類型或者是構(gòu)造數(shù)據(jù)類型。數(shù)組元素按順序分配在內(nèi)存中一塊連續(xù)的存儲(chǔ)區(qū)域中,每個(gè)元素的類型相同并占用相同大小的內(nèi)存單元。數(shù)組元素是一種變量,只是數(shù)組中的元素沒(méi)有獨(dú)立的變量名,而是用數(shù)組名以及元素在數(shù)組中的位置號(hào)來(lái)標(biāo)識(shí)該元素。數(shù)組元素在數(shù)組中的位置號(hào)通常稱為下標(biāo),所以數(shù)組元素也稱為下標(biāo)變量,并通過(guò)下標(biāo)相互區(qū)分。數(shù)組可以有多個(gè)下標(biāo),下標(biāo)的個(gè)數(shù)稱為數(shù)組的維數(shù)。數(shù)組按維數(shù)的多少可分為一維數(shù)組和多維數(shù)組5.2一維數(shù)組在C語(yǔ)言中使用數(shù)組之前必須先進(jìn)行定義。數(shù)組要占用內(nèi)存空間,定義時(shí)需要指定數(shù)組有多少個(gè)元素以及類型,使編譯系統(tǒng)可以分配相應(yīng)的內(nèi)存空間。數(shù)組的維數(shù)在其定義中給定。5.2.1一維數(shù)組的定義與初始化
1.一維數(shù)組定義
一般格式為:存儲(chǔ)類型數(shù)據(jù)類型數(shù)組名[常量表達(dá)式];存儲(chǔ)類型與變量聲明中的存儲(chǔ)類型相同。數(shù)據(jù)類型可以是所有的C語(yǔ)言數(shù)據(jù)類型(包括基本數(shù)據(jù)類型或構(gòu)造類型)。它指明了數(shù)組的數(shù)據(jù)類型也就是該數(shù)組所有元素的數(shù)據(jù)類型,對(duì)于同一個(gè)數(shù)組,其所有元素的數(shù)據(jù)類型都是相同的。數(shù)組名是標(biāo)識(shí)符。數(shù)組名后的一對(duì)方括號(hào)是必須的,它指明前面的標(biāo)識(shí)符是數(shù)組名而不是普通變量名。方括號(hào)中的常量表達(dá)式表示數(shù)組元素的個(gè)數(shù),也稱為數(shù)組的長(zhǎng)度。要求必須是整型。
例:數(shù)組定義方式#include<stdio.h>#defineSIZE20voidmain(){intn=5;inta1[5];/*可以,整型常量*/inta2[5*2+1];/*可以,整型常量表達(dá)式*/staticdoublea3[sizeof(int)];/*可以,sizeof表達(dá)式被認(rèn)為是一個(gè)整型常量*/chara4[SIZE];/*可以,符號(hào)常量*/inta5[-3];/*不可以,數(shù)組大小必須大于0*/inta6[0];/*不可以,數(shù)組大小必須大于0*/inta7[4.5];/*不可以,數(shù)組大小必須是整數(shù)*/inta8[(int)4.5];/*可以,強(qiáng)制轉(zhuǎn)換為整型*/inta9[n];/*C99之前不可以*/}5.2.1一維數(shù)組的定義與初始化
一旦定義了一個(gè)數(shù)組,系統(tǒng)將分配一塊連續(xù)內(nèi)存空間來(lái)存放它的所有元素,數(shù)組元素通過(guò)數(shù)組名和下標(biāo)來(lái)表示。例如有如下定義:inta[5];在上面的程序中,定義了一個(gè)自動(dòng)(auto)型的整型數(shù)組a,方括號(hào)“[]”中的整型常量“5”指定該數(shù)組共有5個(gè)數(shù)組元素,分別為:a[0],a[1],a[2],a[3],a[4]。每個(gè)元素占用一個(gè)整型大小的內(nèi)存空間。注意:數(shù)組元素下標(biāo)從0開(kāi)始計(jì)算,其它元素順序編號(hào)。2.一維數(shù)組的初始化數(shù)組初始化是指在數(shù)組定義的同時(shí)給數(shù)組元素賦予初值。數(shù)組初始化是在編譯階段進(jìn)行的,這樣將減少運(yùn)行時(shí)間,提高效率。數(shù)組初始化的一般格式為:存儲(chǔ)類型數(shù)據(jù)類型數(shù)組名[常量表達(dá)式]={值,值……值};其中在一對(duì)花括號(hào)“{}”中的各個(gè)值即為各元素的初值,各值之間用逗號(hào)間隔。2.一維數(shù)組的初始化初始化時(shí),花括號(hào)“{}”中的初值的個(gè)數(shù)通常和數(shù)組元素的個(gè)數(shù)一致。例如:inta[5]={23,57,42,36,89};
表示定義了一個(gè)有5個(gè)數(shù)組元素的數(shù)組a,初始化列表花括號(hào)“{}”中的初值的個(gè)數(shù)也是5個(gè)。其初始化結(jié)果是將各個(gè)初值按順序賦予對(duì)應(yīng)的數(shù)組元素。即a[0]=23,a[1]=57,a[2]=42,a[3]=36,a[4]=89。2.一維數(shù)組的初始化如果初始值的個(gè)數(shù)少于數(shù)組元素個(gè)數(shù),其余的元素將被初始化為零。
例如:intb[5]={23,57,42};
表示定義了一個(gè)有5個(gè)數(shù)組元素的數(shù)組b,初始化列表花括號(hào)“{}”中的初值個(gè)數(shù)只有3個(gè)。其初始化結(jié)果是只給b[0]到b[2]前3個(gè)元素賦值,而后2個(gè)元素自動(dòng)賦0值。即b[0]=23,b[1]=57,b[2]=42,b[3]=0,b[4]=0。如果初值的個(gè)數(shù)多于數(shù)組元素的個(gè)數(shù),將產(chǎn)生編譯錯(cuò)誤。2.一維數(shù)組的初始化如果初始化時(shí),方括號(hào)“[]”中的常量表達(dá)式為空,即省略數(shù)組元素的個(gè)數(shù),那么編譯器將用初始化列表花括號(hào)“{}”中初值的個(gè)數(shù)來(lái)隱式地指定數(shù)組的大小。例如:inta[]={23,57,42,36,89};則編譯器根據(jù)初始化列表中初值的個(gè)數(shù)指定數(shù)組的大小為5。如果不初始化數(shù)組,自動(dòng)(auto)型的數(shù)組元素和未初始化的自動(dòng)(auto)型普通變量一樣,其中存儲(chǔ)的是無(wú)用的數(shù)據(jù)。5.2.2一維數(shù)組元素的引用數(shù)組元素是組成數(shù)組的基本單元。對(duì)數(shù)組的引用最終都是通過(guò)對(duì)其元素的引用而實(shí)現(xiàn)的。數(shù)組元素可以通過(guò)數(shù)組名加上用方括號(hào)“[]”括起來(lái)的下標(biāo)表達(dá)式來(lái)引用。引用數(shù)組元素一般格式為:數(shù)組名[下標(biāo)表達(dá)式]其中下標(biāo)表達(dá)式可以為常量、變量或表達(dá)式,要求必須為整型。下標(biāo)表達(dá)式計(jì)算的結(jié)果是元素在數(shù)組中的下標(biāo)。實(shí)際上,包括下標(biāo)的方括號(hào)“[]”是一個(gè)C運(yùn)算符,稱為下標(biāo)運(yùn)算符,其優(yōu)先級(jí)和結(jié)合性與圓括號(hào)“()”相同。下標(biāo)表達(dá)式如果是整型常量,則可直接明確的指定要訪問(wèn)的是那一個(gè)數(shù)組元素。5.2.2一維數(shù)組元素的引用下標(biāo)表達(dá)式如果是變量,則可比較靈活的指定要訪問(wèn)的是哪個(gè)數(shù)組元素。例如輸出數(shù)組c中所有的元素#include<stdio.h>voidmain(){intc[10]={6,-30,45,0,12,-89,2,-7,56,93};for(inti=0;i<10;i++)printf("%d\t",c[i]);printf("\n");}【例5.1】輸入10個(gè)學(xué)生的成績(jī),要求輸出所有高于平均分的成績(jī)(用數(shù)組處理)。#include<stdio.h>#defineSIZE10voidmain(){inti;floata[SIZE],avg,sum=0;/*定義一個(gè)數(shù)組用來(lái)存放學(xué)生成績(jī)*/for(i=0;i<SIZE;i++) {scanf("%f",&a[i]);/*循環(huán)中逐個(gè)元素的輸入*/ sum=sum+a[i];/*求和*/}avg=sum/SIZE;printf("avg=%f\n",avg);
for(i=0;i<SIZE;i++) if(a[i]>avg)/*循環(huán)中依次判斷各數(shù)組元素*/printf("%.2f\t",a[i]);printf("\n");}5.2.2一維數(shù)組元素的引用在引用數(shù)組元素時(shí)要注意,如果用超出數(shù)組的合法下標(biāo)范圍的表達(dá)式進(jìn)行數(shù)據(jù)的訪問(wèn),會(huì)導(dǎo)致越界訪問(wèn)的錯(cuò)誤?!纠吭浇缭L問(wèn)示例一#include<stdio.h>voidmain(){intc[10]={6,-30,45,0,12,-89,2,-7,56,93};printf("%d\n",c[10]);/*沒(méi)有這個(gè)數(shù)組元素*/}C編譯器不會(huì)檢查下標(biāo)的合法性。如果使用了錯(cuò)誤的下標(biāo),程序執(zhí)行結(jié)果是不可知的,程序或者能運(yùn)行,但是運(yùn)行結(jié)果可能很奇怪,也可能會(huì)中斷程序的執(zhí)行。【例】越界訪問(wèn)示例二#include<stdio.h>voidmain(){inta=11,b[2],c=99,i;printf("a=%d\tc=%d\n",a,c);for(i=-1;i<3;i++)b[i]=2*i;for(i=-1;i<4;i++)printf("b[%2d]=%d\n",i,b[i]);printf("a=%d\tc=%d\n",a,c);}程序中通常使用數(shù)組存儲(chǔ)數(shù)據(jù),C語(yǔ)言不支持把數(shù)組作為一個(gè)整體來(lái)賦值,也不支持用花括號(hào)括起來(lái)的列表形式進(jìn)行賦值(初始化的時(shí)候除外)。下面例子中展示了一些不允許的賦值方式?!纠繜o(wú)效的數(shù)組賦值#include<stdio.h>voidmain(){inta[10],b[10]={1,2,3,4,5};/*初始化是可以的*/a=b;/*不允許*/a={1,2,3,4,5};/*不允許*/a[10]={1,2,3,4,5};/*不允許*/}程序中要對(duì)數(shù)組賦值,只能一個(gè)一個(gè)元素地逐個(gè)賦值,通常是利用循環(huán)進(jìn)行的?!纠繑?shù)組元素賦值#include<stdio.h>voidmain(){inti,a[5],b[5]={1,2,3,4,5};for(i=0;i<5;i++)a[i]=b[i];/*循環(huán)中依次賦值*/for(i=0;i<5;i++)printf("%d\t",a[i]);printf("\n");}程序中不能用scanf()函數(shù)直接賦值給整個(gè)數(shù)組(字符數(shù)組除外)。下面例子中展示了一些不正確的用scanf()函數(shù)給數(shù)組元素賦值的方式。【例】無(wú)效的用scanf()函數(shù)給數(shù)組元素賦值#include<stdio.h>voidmain(){inta[10];scanf("%d%d%d%d%d%d%d%d%d%d",&a);/*不正確*/scanf("%d%d%d%d%d%d%d%d%d%d",a);/*不正確*/scanf("%d",a);/*不正確*/scanf("%d",&a);/*不正確*/
}也不能用printf()函數(shù)直接輸出整個(gè)數(shù)組(字符數(shù)組除外)。下面例子中展示了一些不正確的用printf()函數(shù)輸出數(shù)組元素的方式?!纠繜o(wú)效的用printf()函數(shù)輸出數(shù)組元素#include<stdio.h>voidmain(){inta[5]={1,2,3,4,5};printf("%d\n",a);/*不正確*/printf("%d,%d,%d,%d,%d\n",a);/*不正確*/
}程序中用scanf()函數(shù)給數(shù)組元素賦值以及用printf()函數(shù)輸出數(shù)組元素值時(shí)通常要用到循環(huán)?!纠繑?shù)組元素的輸入輸出#include<stdio.h>voidmain(){inta[5],i;for(i=0;i<5;i++) scanf("%d",&a[i]);for(i=0;i<5;i++)
printf("%d\n",a[i]);
}5.2.3一維數(shù)組作為函數(shù)參數(shù)
數(shù)組可以作為函數(shù)的參數(shù)使用,進(jìn)行數(shù)據(jù)傳送。數(shù)組用作函數(shù)參數(shù)有兩種形式,一種是把數(shù)組元素(下標(biāo)變量)作為實(shí)參使用;另一種是把數(shù)組名作為函數(shù)的形參和實(shí)參使用。1.數(shù)組元素作函數(shù)實(shí)參數(shù)組元素作為函數(shù)實(shí)參使用與處理普通變量沒(méi)有什么差別,在發(fā)生函數(shù)調(diào)用時(shí),把作為實(shí)參的數(shù)組元素的值傳送給形參,實(shí)現(xiàn)單向的值傳送。如果在函數(shù)中形參發(fā)生改變,對(duì)作為實(shí)參的數(shù)組元素是沒(méi)有影響的。【例5.2】數(shù)組元素作函數(shù)實(shí)參2.數(shù)組名作為函數(shù)參數(shù)
【例5.3】數(shù)組名作為函數(shù)參數(shù)注意:數(shù)組名作為函數(shù)參函數(shù)時(shí),形參和實(shí)參都必須是類型相同的數(shù)組。另外,為了防止越界訪問(wèn),將數(shù)組傳遞給被調(diào)函數(shù)時(shí),通常也將其長(zhǎng)度同時(shí)傳遞給被調(diào)函數(shù),注意:在用數(shù)組名作函數(shù)參數(shù)時(shí),不是把實(shí)參數(shù)組的每一個(gè)元素的值都賦予形參數(shù)組的各個(gè)元素。編譯器不為形參數(shù)組分配內(nèi)存。函數(shù)調(diào)用時(shí),形參數(shù)組名從實(shí)參數(shù)組那里取得首地址之后,也就等于有了實(shí)際的存儲(chǔ)空間(與實(shí)參數(shù)組共用)。5.2.4一維數(shù)組應(yīng)用舉例
1.統(tǒng)計(jì)【例5.4】有一個(gè)學(xué)院在學(xué)生會(huì)換屆選舉中由全體學(xué)生無(wú)記名投票直選學(xué)生會(huì)主席,共有10名候選人,每個(gè)人的代號(hào)分別用1,2,3,…,10表示。每個(gè)學(xué)生填寫(xiě)一張選票,若同意某名候選人則在其姓名后畫(huà)個(gè)圓圈即可(只能選一個(gè))。編寫(xiě)一個(gè)程序根據(jù)所有選票統(tǒng)計(jì)出每位候選人所得票數(shù),其中每張選票上所投候選人的代號(hào)從鍵盤(pán)輸入,當(dāng)輸入完所有選票后用-1作為數(shù)據(jù)輸入結(jié)束的標(biāo)志。
2.排序【例5.5】已知有10個(gè)整數(shù):24,56,8,47,63,82,27,15,90,39,編寫(xiě)一個(gè)程序按照從小到大的順序輸出。第一趟j=0第二趟j=1245684763824475663i=1245684763第三趟j=2i=2248
564763824475663i=3248475663i=42484756633.查找【例5.6】已知有10個(gè)整數(shù):22,10,44,17,31,51,89,68,120,95,從鍵盤(pán)輸入一個(gè)給定值x,在該序列中查找是否有與給定值x相等的一個(gè)數(shù)。1)順序查找2)二分查找4.插入【題目】已知有10個(gè)整數(shù):3,6,18,28,54,68,87,105,127,162,已從小到大排好序,編寫(xiě)一個(gè)程序?qū)⒁唤o定值x插入到該序列中并保持原來(lái)的從小到大的順序不變。給定值x從鍵盤(pán)輸入。思考題:5.3二維數(shù)組5.3.1二維數(shù)組的定義與初始化1.二維數(shù)組的定義二維數(shù)組定義的一般格式是:存儲(chǔ)類型數(shù)據(jù)類型數(shù)組名[整型表達(dá)式1][整型表達(dá)式2]二維數(shù)組定義的要求和一維數(shù)組定義的一樣,只是多了一對(duì)方括號(hào)“[]”極其整型表達(dá)式。其中整型表達(dá)式1表示第一維(行)的長(zhǎng)度,整型表達(dá)式2表示第二維(列)的長(zhǎng)度。【例】二維數(shù)組定義#include<stdio.h>voidmain(){inta[3][4];introw=2,col=3;doubleb[row][col];/*變長(zhǎng)數(shù)組,C99之前不可以*/}假設(shè)第一維(行)的長(zhǎng)度為m,第二維(列)的長(zhǎng)度為n,則整個(gè)數(shù)組的元素個(gè)數(shù)為m×n個(gè)。二維數(shù)組的數(shù)組元素用數(shù)組名和兩個(gè)下標(biāo)表示,則數(shù)組元素行下標(biāo)的取值范圍是0~m-1之間的m個(gè)整數(shù),列下標(biāo)的取值范圍是0~n-1之間的n個(gè)整數(shù)。例如,上面程序中定義的二維數(shù)組a,共有3×4=12個(gè)數(shù)組元素,行下標(biāo)的取值范圍是0~2;列下標(biāo)的取值范圍是0~3。2.二維數(shù)組的初始化1)按行分組賦值將初值分別用花括號(hào)“{}”
括起來(lái)進(jìn)行按行分組,例如:【例】按行分組初始化#include<stdio.h>voidmain(){inta[2][3]={{80,75,92},{61,65,71}};}2)按行連續(xù)賦值初值之間沒(méi)有用花括號(hào)“{}”按行分組,只有最外面的一對(duì)花括號(hào)“{}”。例如:【例】按行連續(xù)初始化#include<stdio.h>voidmain(){inta[2][3]={80,75,92,61,65,71};}系統(tǒng)將自動(dòng)用初值按順序一行一行初始化各數(shù)組元素。5.3
.2二維數(shù)組數(shù)組元素的引用
二維數(shù)組的元素也稱為雙下標(biāo)變量,其表示使用的格式為:數(shù)組名[下標(biāo)表達(dá)式][下標(biāo)表達(dá)式]其中下標(biāo)表達(dá)式可以為常量、變量或表達(dá)式,要求必須為整型。對(duì)行下標(biāo)和列下標(biāo)都要進(jìn)行運(yùn)算來(lái)唯一指定二維數(shù)組中的一個(gè)元素使用二維數(shù)組的元素同使用一維數(shù)組的元素和普通變量一樣,既可以用它存儲(chǔ)數(shù)據(jù),又可以取出它的值參與運(yùn)算?!纠恳脭?shù)組元素時(shí)兩個(gè)下標(biāo)都為整型常量#include<stdio.h>voidmain(){inta[3][4]={{20,51,-64,8},{42,97,33,84},{102,76,12,9}};printf("%d\n",a[0][1]);}【例】引用數(shù)組元素時(shí)行下標(biāo)為整型常量,下列標(biāo)為整型變量#include<stdio.h>voidmain(){inta[3][4]={{20,51,-64,8},{42,97,33,84},{102,76,12,9}};intcolumn;for(column=0;column<4;column++)a[1][column]*=2;for(column=0;column<4;column++)printf("%d\t",a[1][column]);printf("\n");}【例】引用數(shù)組元素時(shí)兩個(gè)下標(biāo)都為變量#include<stdio.h>voidmain(){inta[3][4]={{20,51,-64,8},{42,97,33,84},{102,76,12,9}};inttotal=0,row,column;for(row=0;row<3;row++)for(column=0;column<4;column++)total+=a[row][column];printf("%d\n",total);}5.3.3二維數(shù)組應(yīng)用舉例【例5.7】有下列一個(gè)3×4的矩陣,要求編寫(xiě)程序輸出其中值最大的那個(gè)元素,以及其所在的行號(hào)和列號(hào)。12-349876-1016-52【例5.8】一個(gè)小組有5位學(xué)生,每個(gè)人有三門(mén)課程的考試成績(jī),如下表所示。編寫(xiě)一個(gè)程序計(jì)算全組學(xué)生的各門(mén)課程的分科平均成績(jī)和總平均成績(jī)。
課程成績(jī)姓名語(yǔ)文數(shù)學(xué)英語(yǔ)張三807592王五616571李四536370趙一858790周六7677855.4字符數(shù)組5.4.1字符串與字符數(shù)組字符串是一個(gè)或多個(gè)字符的序列。下面是一個(gè)字符串的例子:"Howareyou"這里雙引號(hào)“”不是字符串的一部分。他們只是通知編譯器其中包含了一個(gè)字符串。C語(yǔ)言中沒(méi)有為字符串定義專門(mén)的變量類型,而是把它存儲(chǔ)在字符數(shù)組中。雙引號(hào)中的字符加上編譯器自動(dòng)添加的結(jié)束符‘\0’,作為一個(gè)字符串被存儲(chǔ)在相鄰的內(nèi)存單元中,每個(gè)字符占用一個(gè)單元。字符數(shù)組就是數(shù)據(jù)類型為字符型的數(shù)組,每個(gè)元素可以用來(lái)存放一個(gè)字符。如果字符數(shù)組包含了空字符‘\0’,那么字符數(shù)組的內(nèi)容就構(gòu)成一個(gè)字符串,其中空字符‘\0’標(biāo)志著字符串的結(jié)尾。但如果字符數(shù)組中沒(méi)有空字符‘\0’,則不能表示一個(gè)字符串。
5.4.2字符數(shù)組的定義與初始化
1.字符數(shù)組定義
字符數(shù)組定義形式與其它類型數(shù)組相同。例如,下面定義了一個(gè)有10個(gè)元素的字符數(shù)組c(其中每個(gè)數(shù)組元素中可以存放一個(gè)字符):【例】字符數(shù)組定義#include<stdio.h>voidmain(){charc[10];}字符數(shù)組也可以是二維或多維數(shù)組。例如,下面定義了一個(gè)5行10列的二維字符數(shù)組:【例】二維字符數(shù)組定義#include<stdio.h>voidmain(){chard[5][10];}2.字符數(shù)組初始化
字符數(shù)組也允許在定義時(shí)作初始化賦值。【例】字符數(shù)組初始化#include<stdio.h>voidmain(){charstr1[10]={‘p’,‘r’,‘o’,‘g’,‘r’,‘a(chǎn)’,’m’};}當(dāng)對(duì)全體元素賦初值時(shí)也可以省去長(zhǎng)度說(shuō)明。例如:【例】省去長(zhǎng)度說(shuō)明的字符數(shù)組初始化#include<stdio.h>voidmain(){charstr2[]={‘p’,‘r’,‘o’,‘g’,‘r’,‘a(chǎn)’,’m’};}【例】用字符串常量進(jìn)行初始化#include<stdio.h>voidmain(){charstr4[50]="Youcanseeit.";}當(dāng)然,進(jìn)行初始化時(shí)如果省略數(shù)組大小,讓編譯器決定數(shù)組大小是很方便的。例如:【例】用字符串常量進(jìn)行初始化時(shí)省略數(shù)組大小#include<stdio.h>voidmain(){charstr5[]="program";}5.4.3字符數(shù)組的引用
字符數(shù)組的引用和其他類型數(shù)組一樣,通過(guò)數(shù)組名加上用方括號(hào)“[]”括起來(lái)的下標(biāo)表達(dá)式來(lái)引用數(shù)組中的各個(gè)元素?!纠?.9】字符數(shù)組中各元素的訪問(wèn)#include<stdio.h>voidmain(){inti=0;charstr[]="program";while(str[i]!='\0')//判斷字符串是否結(jié)束
{str[i]=str[i]-32;//小寫(xiě)字母轉(zhuǎn)化為大寫(xiě)
printf("%c",str[i]);//單個(gè)元素(字符)輸出
i++;}printf("\n");}5.4.4字符串輸出和輸入
1.字符串輸出(1)printf()函數(shù)在程序中還可以使用帶%s格式控制符的printf()函數(shù),輸出一個(gè)字符串,但需要一個(gè)字符串地址如字符數(shù)組名作為對(duì)應(yīng)的輸出項(xiàng)?!纠縫rintf()函數(shù)帶%s格式控制符輸出#include<stdio.h>voidmain(){ charstring[]="stringliteral";printf("%s\n",string);//字符數(shù)組名作為輸出項(xiàng)
printf("%s\n",&string[3]);//數(shù)組元素的地址作為輸出項(xiàng)}(2)puts()函數(shù)使用puts()函數(shù)輸出字符串,只需要給出字符串地址作為參數(shù)。【例】puts()函數(shù)示例#include<stdio.h>voidmain(){charstring[]="stringliteral";puts("Thisisanexample");//字符串常量作為參數(shù)puts(string);//字符數(shù)組名作為參數(shù)
puts(&string[3]);//數(shù)組元素的地址作為參數(shù)}puts()函數(shù)和printf()函數(shù)都可以用于輸出字符串,例如,下面兩條語(yǔ)句效果一樣。printf("%s\n",string);puts(string);printf()函數(shù)與puts()函數(shù)主要區(qū)別在于:printf()函數(shù)并不會(huì)自動(dòng)添加換行符而在新行上輸出每個(gè)字符串。使用printf()函數(shù)時(shí),必須明確指出需要另起一行的位置,并添加換行符‘\n’
進(jìn)行換行。所以printf()函數(shù)使用起來(lái)沒(méi)有puts()函數(shù)方便,需要鍵入更多的代碼,不過(guò)用printf()函數(shù)可以很簡(jiǎn)單的在一行上輸出多個(gè)字符串。2.字符串輸入
要把一個(gè)字符串讀到程序中,必須首先預(yù)留存儲(chǔ)字符串的空間,然后使用輸入函數(shù)來(lái)獲取這個(gè)字符串。最簡(jiǎn)單的方法是定義一個(gè)足夠大小的字符數(shù)組,用來(lái)存放該字符串。(1)scanf()函數(shù)使用帶%s格式控制符scanf()函數(shù)可以用來(lái)讀入一個(gè)字符串?!纠縮canf()函數(shù)帶%s格式控制符輸入#include<stdio.h>voidmain(){charname[51];printf("What'syourname?\n");scanf("%s",name);printf("Nicename,%s.\n",name);}scanf()函數(shù)開(kāi)始讀取輸入后,會(huì)在遇到的第一個(gè)空白字符:空格(blank)、制表符(tab)或換行符(newline)處停止讀取。因此,使用%s的scanf()函數(shù)只會(huì)把一個(gè)單詞而不是把整個(gè)語(yǔ)句作為字符串讀入。(2)gets()函數(shù)使用gets()函數(shù)可以從系統(tǒng)的標(biāo)準(zhǔn)設(shè)備(通常是鍵盤(pán))獲取一個(gè)字符串。因?yàn)樽址疀](méi)有預(yù)定的長(zhǎng)度,所以gets()函數(shù)需要知道輸入何時(shí)結(jié)束。解決方法是讀字符串直到遇到一個(gè)換行符(newline),按回車鍵可以產(chǎn)生這個(gè)字符。gets()函數(shù)將讀取換行符之前(不包括換行符)的所有字符,并在這些字符后添加一個(gè)空字符‘\0’。然后把這個(gè)字符串交給調(diào)用它的程序。gets()函數(shù)會(huì)將讀取的換行符丟棄,這樣下一次讀取就會(huì)在新的一行開(kāi)始。【例】gets()函數(shù)示例#include<stdio.h>voidmain(){charname[51];printf("What'syourname?\n");gets(name);printf("Nicename,%s.\n",name);}scanf()函數(shù)和gets()函數(shù)主要區(qū)別在于如何決定字符串何時(shí)結(jié)束。scanf()函數(shù)遇到的第一個(gè)空白字符(空格、制表符或換行符)停止讀取。gets()函數(shù)在遇到的第一個(gè)換行符停止讀取。scanf()函數(shù)更基于獲取單詞而不是獲取字符串。5.4.5字符數(shù)組應(yīng)用舉例
【例5.10】編寫(xiě)一個(gè)程序,實(shí)現(xiàn)從鍵盤(pán)上輸入一個(gè)字符串,將該字符串中的小寫(xiě)字母變?yōu)榇髮?xiě)字母,而其它字符保持不變。分析:先定義一個(gè)足夠大小的字符數(shù)組str,存放從鍵盤(pán)上輸入一個(gè)字符串。從該字符數(shù)組第一元素str[0](存放著字符串第一個(gè)字符)開(kāi)始,每個(gè)數(shù)組元素逐一(即字符)判斷,看是否為小寫(xiě)字母,如果是就進(jìn)行轉(zhuǎn)換。如果不是則不變,直到該字符串結(jié)束【例5.11】“回文”是從前向后和從后向前讀起來(lái)都一樣的句子。例如英文中的:“l(fā)evel”、“radar”等。編寫(xiě)一個(gè)程序判斷一個(gè)字符串是否為一個(gè)“回文”。分析:先用字符串的第一個(gè)字符和最后一個(gè)字符進(jìn)行比較看是否相等,如果相等就繼續(xù)比較第二個(gè)字符和倒數(shù)第二個(gè)字符,以此類推。比較過(guò)程中只要有一次比較不相等,則可判斷不是“回文”,如果比較到最中間的字符時(shí)都相等則可以判斷是“回文”。5.4.6字符串處理函數(shù)
由于字符串的使用非常廣泛,C標(biāo)準(zhǔn)庫(kù)提供了許多專門(mén)處理字符串的函數(shù)(參見(jiàn)附錄C),這些函數(shù)的原型在頭文件“string.h”里說(shuō)明。要使用標(biāo)準(zhǔn)字符串處理函數(shù)時(shí),程序前部應(yīng)寫(xiě):#include<string.h>1.求字符串長(zhǎng)度函數(shù)strlen()函數(shù)原型:intstrlen(constchars[])本函數(shù)的功能是求出字符串的長(zhǎng)度,也就是字符串里的字符個(gè)數(shù)。在計(jì)算字符個(gè)數(shù)時(shí)不計(jì)表示字符串結(jié)束的空字符‘\0’。該函數(shù)只有一個(gè)類型為字符的數(shù)組參數(shù),參數(shù)前面使用了關(guān)鍵字const表示該參數(shù)的內(nèi)容在函數(shù)執(zhí)行中是不允許改變的。該函數(shù)對(duì)應(yīng)的實(shí)參可以是任何形式的字符串,如一個(gè)字符串常量、一個(gè)一維字符數(shù)組等。函數(shù)的返回值是求出的字符串長(zhǎng)度。【例】求字符串長(zhǎng)度函數(shù)示例#include<string.h>#include<stdio.h>voidmain(){chara[10]="",b[]="a",c[20]="StringLength";printf("alengthis:%d\n",strlen(a));//調(diào)用字符串長(zhǎng)度函數(shù)
printf("blengthis:%d\n",strlen(b));printf("clengthis:%d\n",strlen(c));printf("constantlengthis:%d\n",strlen("constant"));}2.字符串復(fù)制函數(shù)strcpy()函數(shù)原型:char*strcpy(char*dest,constchar*src)本函數(shù)的功能是把第二個(gè)參數(shù)src所指字符串復(fù)制到第一個(gè)參數(shù)dest所指的存儲(chǔ)空間(即dest字符數(shù)組)中。該函數(shù)有兩個(gè)字符指針參數(shù),因?yàn)槊總€(gè)字符指針是指向相應(yīng)字符串的首地址。而字符數(shù)組名就是所在字符串的首地址。所以字符數(shù)組名也就是一個(gè)字符指針。字符指針參數(shù)說(shuō)明同字符數(shù)組參數(shù)說(shuō)明是等價(jià)的,既該函數(shù)的兩個(gè)參數(shù)說(shuō)明同chardest[]和constcharsrc[]是等價(jià)的。參數(shù)dest或src都能接受由實(shí)參傳遞來(lái)的一個(gè)字符指針,既一個(gè)字符串存儲(chǔ)空間的首地址。因?yàn)樵摵瘮?shù)只需要從第二個(gè)參數(shù)src字符串中讀取內(nèi)容,不需要修改它,所以用const修飾,而對(duì)于第一個(gè)參數(shù)dest,需要修改它的內(nèi)容,所以就不能用const修飾。函數(shù)的返回值是一個(gè)字符指針,即dest字符數(shù)組的首地址。dest應(yīng)是一個(gè)足夠大的字符數(shù)組,以保證字符串復(fù)制不越界。
【例】字符串復(fù)制函數(shù)示例#include<string.h>#include<stdio.h>voidmain(){chara[10],b[10]="strcopy",c[20];strcpy(a,b);//調(diào)用字符串復(fù)制函數(shù)
strcpy(c,"constant");printf("a=%s\tb=%s\t",a,b);printf("c=%s\n",c);}1.字符串比較函數(shù)strcmp()函數(shù)原型:intstrcmp(constchar*s1,constchar*s2)本函數(shù)的功能是比較s1所指字符串與s2所指字符串的大小,若字符串s1大于字符串s2時(shí)返回一個(gè)大于0的值(C標(biāo)準(zhǔn)沒(méi)有規(guī)定采用什么值);若兩個(gè)字符串s1和s2相同時(shí)返回0;若字符串s1小于字符串s2時(shí)返回一個(gè)小于0的值。判斷字符串大小的標(biāo)準(zhǔn)是字典序(普通英語(yǔ)詞典里排列單詞詞條時(shí)所用的順序)。該函數(shù)有兩個(gè)字符指針參數(shù),各自指向相應(yīng)的字符串。函數(shù)的返回值為整型。
【例】字符串復(fù)制函數(shù)示例#include<string.h>#include<stdio.h>voidmain(){chara[10]="int",b[10]="double",c[20]="float";printf("%d\n",strcmp(a,b));//調(diào)用字符串復(fù)制函數(shù)
printf("%d\n",strcmp(b,c));printf("%d\n",strcmp("int",a));}4.字符串連接函數(shù)strcat()函數(shù)原型:char*strcat(char*dest,constchar*src)。本函數(shù)的功能是把第二個(gè)參數(shù)src所指字符串復(fù)制到第一個(gè)參數(shù)dest所指字符串中已有字符的后面,形成相當(dāng)于兩個(gè)串連在一起的字符串。這里要求dest所指字符串之后有足夠大的存儲(chǔ)空間用于存儲(chǔ)src串。該函數(shù)有兩個(gè)字符指針參數(shù),各自指向相應(yīng)的字符串。函數(shù)的返回值為dest的指針。【例】字符串連接函數(shù)示例#include<string.h>#include<stdio.h>
voidmain(){charb1[40]="Programming",b2[10]="C";strcat(b1,"language");
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025恒豐銀行青島分行社會(huì)招聘6人備考題庫(kù)完整答案詳解
- 2026年咸陽(yáng)市渭城區(qū)就業(yè)見(jiàn)習(xí)計(jì)劃招聘?jìng)淇碱}庫(kù)及參考答案詳解
- 2026年度漯河市市直機(jī)關(guān)遴選公務(wù)員17人備考題庫(kù)(含答案詳解)
- 2026年淮北市衛(wèi)生健康委員會(huì)直屬醫(yī)療機(jī)構(gòu)公開(kāi)招聘工作人員13名備考題庫(kù)及答案詳解(新)
- 2025華大教育集團(tuán)教師招聘10人備考題庫(kù)及完整答案詳解
- 2025中國(guó)電信濱海分公司招聘2人備考題庫(kù)及答案詳解參考
- 2025年西安交通大學(xué)第一附屬醫(yī)院醫(yī)學(xué)影像科招聘?jìng)淇碱}庫(kù)及參考答案詳解一套
- 爐渣生產(chǎn)車間管理制度
- 安全生產(chǎn)員工獎(jiǎng)勵(lì)制度
- 彈簧鋼絲生產(chǎn)規(guī)章制度
- 金融領(lǐng)域人工智能算法應(yīng)用倫理與安全評(píng)規(guī)范
- 2026長(zhǎng)治日?qǐng)?bào)社工作人員招聘勞務(wù)派遣人員5人備考題庫(kù)及答案1套
- 機(jī)動(dòng)車駕校安全培訓(xùn)課件
- 河道清淤作業(yè)安全組織施工方案
- 2025年役前訓(xùn)練考試題庫(kù)及答案
- 2026年七臺(tái)河職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)附答案
- 2021海灣消防 GST-LD-8318 緊急啟停按鈕使用說(shuō)明書(shū)
- 煙花爆竹零售經(jīng)營(yíng)安全責(zé)任制度
- 2023年和田地區(qū)直遴選考試真題匯編含答案解析(奪冠)
- ICG熒光導(dǎo)航在肝癌腹腔鏡解剖性肝切除中的應(yīng)用2026
- 2023-2024學(xué)年廣東省廣州市小學(xué)數(shù)學(xué)二年級(jí)上冊(cè)期末自我評(píng)估試題
評(píng)論
0/150
提交評(píng)論