




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
§6.3字符數(shù)組6.3.1字符數(shù)組的定義與初始化1.字符數(shù)組的定義字符數(shù)組的定義方法式與前面介紹的其他類型的數(shù)組定義方法完全相同。例如:charc[10];由于字符型和整型通用,也可以定義為intc[10],但這時每個數(shù)組元素占2個字節(jié)的內(nèi)存單元。字符數(shù)組也可以是二維或多維數(shù)組。例如:charc[5][10];定義了5行10列的二維字符數(shù)組c。字符數(shù)組也允許在定義時作初始化賦值。例如:charc[10]={'c','','p','r','o','g','r','a','m'};賦值后各元素的值為:c[0]的值為‘c’;c[1]的值為‘’;c[2]的值為‘p’;c[3]的值為‘r’;c[4]的值為‘0’;c[5]的值為‘g’;c[6]的值為‘r’;c[7]的值為‘a(chǎn)’;c[8]的值為‘m’。其中c[9]未賦值,c[9]的值由系統(tǒng)自動賦予0值,即為’\0’。當(dāng)對全體元素賦初值時也可以省去長度說明。例如:charc[]={'c','','p','r','o','g','r','a','m'};這時c數(shù)組的長度自動定為9。字符型的二維數(shù)組,可以用來存放更多的字符串。以下兩個字符串的功能等效:charx[5][10]={{‘o’,’n’,’e’},{‘t’,’w’,o},{‘t’,’h’,’r’,’e’,’e’},{‘f’,’o’,’u’,’r’},{‘f’,’i’,’v’,’e’}};charx[5][10]={“one”,”two”,”three”,”four”,”five”};2.字符數(shù)組的初始化用來存放char類型數(shù)據(jù)的數(shù)組稱為字符數(shù)組。數(shù)組的每個元素都是一個char類型的字符。字符串是這樣一串字符,前面由若干個字符組成,最后一個字符是’\0’,作為字符串的結(jié)束標(biāo)識。在程序中,字符數(shù)組可以存放字符,也可以存放字符串。一維數(shù)組可以存放字符串,二維數(shù)組也可以存放字符串,二維數(shù)組中每行存放一個字符串。不管字符數(shù)組中存放的是字符還是字符串,數(shù)組中每個元素都可以作為一個字符變量來引用,但是對于存放字符串的字符數(shù)組,系統(tǒng)提供了一些特殊的處理方法和處理函數(shù)。6.3.2字符數(shù)組的引用
1.字符數(shù)組的賦值(1)給字符串賦初值
charsl[]={’a’,’b’,’c’,’d’,’e’,’\0’);chars2[]=”12345”;
//系統(tǒng)自動在末尾加了一個’\0’(2)從鍵盤逐個字符輸入,最后人工補’\0’,例如:
for(i=0;i<n;i++)
sl[i]=getchar();//從鍵盤輸入
sl[n]=’\0’;//人為加上串結(jié)束標(biāo)志或
for(i=0;i<n;i++)
scanf(”%c”,&s2[i]);
//從鍵盤輸入
s2[n]=’\0’;
//人為加上串結(jié)束標(biāo)志(3)使用格式符“%s”,通過scanf函數(shù),將整個字符串一次輸入。
scanf(“%s”,s3);
輸入的連續(xù)字符作為一個字符串,賦值給字符型的數(shù)組s3,注意:字符串中間不能帶有空格??崭褡鳛槎鄠€字符串輸入的分隔符,該語句可以一次輸入多個字符串。(4)字符串輸入gets()函數(shù)。例如:
gets(sl);從鍵盤輸入,字符串中間可以帶空格。該函數(shù)只能輸入一個字符串。(1)用循環(huán)逐個輸出
for(i=0;i<n;i++)
putchar(sl[i]);//逐個輸出(2)使用格式符“%s”,通過printf函數(shù),將整個字符串一次輸出。
printf(“%s”,s3);
在屏幕上輸出一個字符串。(3)用puts()函數(shù)整體輸出
puts(s2);//整體輸出在屏幕上輸出一個字符串,該函數(shù)會自動將字符串末尾的\0轉(zhuǎn)換成換行符輸出。即自動換行。2.字符數(shù)組的輸出#include<stdio.h>main(){charst[15];
printf("inputstring:");
scanf("%s",st);
printf("yourstringis:%s\n",st);return0;}本例中由于定義數(shù)組長度為15,因此輸入的字符串長度必須小于15,以留出一個字節(jié)用于存放字符串結(jié)束標(biāo)志`\0`。應(yīng)該說明的是,對一個字符數(shù)組,如果不作初始化賦值,則必須說明數(shù)組長度。還應(yīng)該特別注意的是,當(dāng)用scanf函數(shù)輸入字符串時,字符串中不能含有空格,否則將以空格作為串的結(jié)束符?!纠?.26】使用scanf()從控制臺輸入一個字符串,然后使用printf()將其輸出。#include<stdio.h>main(){int
i,j;chara[][5]={{'B','A','S','I','C',},{'d','B','A','S','E'}};
for(i=0;i<=1;i++){for(j=0;j<=4;j++)
printf("%c",a[i][j]);
printf("\n");}}【例6.25】輸出字符數(shù)組中的元素。本程序分別設(shè)了四個數(shù)組,輸入的一行字符的空格分段分別裝入四個數(shù)組。然后分別輸出這四個數(shù)組中的字符串。在前面介紹過,scanf的各輸入項必須以地址方式出現(xiàn),如&a、&b等。但在前例中卻是以數(shù)組名方式出現(xiàn)的,這是為什么呢?這是由于在C語言中規(guī)定,數(shù)組名就代表了該數(shù)組的首地址。整個數(shù)組是以首地址開頭的一塊連續(xù)的內(nèi)存單元。如有字符數(shù)組charc[10],在內(nèi)存可表示如表6-2-3:
設(shè)數(shù)組c的首地址為2000,也就是說c[0]單元地址為2000。則數(shù)組名c就代表這個首地址。因此在c前面不能再加地址運算符&。如寫作scanf("%s",&c);則是錯誤的。在執(zhí)行函數(shù)printf("%s",c)時,按數(shù)組名c找到首地址,然后逐個輸出數(shù)組中各個字符直到遇到字符串終止標(biāo)志'\0'為止。表6-2-3字符數(shù)組在內(nèi)存中的表示#include<stdio.h>main(){charst1[6],st2[6],st3[6],st4[6];
printf("inputstring:");scanf("%s%s%s%s",st1,st2,st3,st4);
printf("yourstring:%s%s
%s%s\n",st1,st2,st3,st4);}例如當(dāng)輸入的字符串中含有空格時,運行情況為:inputstring:thisisabook輸出為:yourstring:this從輸出結(jié)果可以看出空格以后的字符都未能輸出。為了避免這種情況,可多設(shè)幾個字符數(shù)組分段存放含空格的串。程序可改寫如下:6.3.3 字符串與字符數(shù)組在C語言中沒有專門的字符串變量,通常用一個字符數(shù)組來存放一個字符串。前面介紹字符串常量時,已說明字符串總是以'\0'作為串的結(jié)束符。因此當(dāng)把一個字符串存入一個數(shù)組時,也把結(jié)束符'\0'存入數(shù)組,并以此作為該字符串是否結(jié)束的標(biāo)志。有了'\0'標(biāo)志后,就不必再用字符數(shù)組的長度來判斷字符串的長度了。
C語言允許用字符串的方式對數(shù)組作初始化賦值。例如:charc[]={'c','','p','r','o','g','r','a','m'};
可寫為:charc[]={"Cprogram"};
或去掉{}寫為:charc[]="Cprogram";
用字符串方式賦值比用字符逐個賦值要多占一個字節(jié),用于存放字符串結(jié)束標(biāo)志'\0'。上面的數(shù)組c在內(nèi)存中的實際存放情況如表6-2-4所示:‘\0'是由C編譯系統(tǒng)自動加上的。由于采用了‘\0'標(biāo)志,所以在用字符串賦初值時一般無須指定數(shù)組的長度,而由系統(tǒng)自行處理。表6-2-4數(shù)組c在內(nèi)存中的存放情況6.3.4字符串處理的常用系統(tǒng)函數(shù)在實際應(yīng)用中,經(jīng)常要對字符串進行長度計算、復(fù)制、比較、合并、大小寫轉(zhuǎn)換等操作,為此C語言提供了豐富的字符串處理函數(shù)。有了這些函數(shù),可以直接調(diào)用系統(tǒng)函數(shù)完成字符串的處理,大大提高程序設(shè)計的效率。使用這些字符串函數(shù)前,就包含相應(yīng)的頭文件:string.h。即在程序頭加上:#include<string.h>將字符串2復(fù)制到字符數(shù)組1中去(即給一個字符數(shù)組賦值)。(1)字符數(shù)組1必須定義得足夠大,以便容納被復(fù)制的字符串,至少應(yīng)不小于字符串2的長度。(2)字符數(shù)組1必須寫成數(shù)組名形式,字符串2可以是字符數(shù)組名,也可以是一個字符串常量。(3)字符串2后面的’\0’也一同被復(fù)制到字符數(shù)組1中。(4)不能用賦值語句將一個字符串常量或字符數(shù)組直接賦值給一個字符數(shù)組。1.字符串復(fù)制(拷貝)函數(shù)strcpy(字符數(shù)組1,字符串2)【例6.25】閱讀程序分析運行結(jié)果:#include<stdio.h>main(){charc1[]={'I','','a','m','','h','a','p','p','y'};charc2[]="Iamhappy";
inti1=sizeof(c1);
inti2=sizeof(c2);printf("%d\n",i1);printf("%d\n",i2);}程序運行結(jié)果為:連接兩個字符數(shù)組中的字符串,把字符串2接到字符串1的后面,結(jié)果存在字符數(shù)組1中,函數(shù)調(diào)用后返回字符數(shù)組1的地址。(1)字符數(shù)組l必須足夠大,以便容納連接后的新字符串。(2)連接前兩個字符串的后面都有一個’\0’,連接時前一個字符串1的結(jié)束符’\0’被取消,只在新字符串末尾保留一個’\0’。2.字符串連接函數(shù)strcat(字符數(shù)組1,字符數(shù)組2)測試字符串的實際長度,返回值為字符串的實際長度,其中不包括結(jié)束符’\0’。3.求字符串長度函數(shù)strlen(字符串)按字典順序比較字符串1和字符串2,即對兩個字符串自左至右逐個字符相比較(按ASCII碼值大小比較),直到出現(xiàn)不同的字符或遇到’\0’為止。比較結(jié)果返回一個函數(shù)值。如果:
(1)字符串1=-字符串2,函數(shù)返回值為O。
(2)字符串1>字符串2,函數(shù)返回一個正數(shù)。
(3)字符串1<字符串2,函數(shù)返回一個負數(shù)。注意:不能用關(guān)系運算符比較兩個字符串。假定cl和c2是兩個字符串,則以下寫法是錯誤的:
if(cl==c2)prinf("yes");而只能用:
if(strcmp(cl,c2)==O)prinf("yes");4.字符串比較函數(shù)strcmp(字符串1,字符串2)(1)strlwr(字符串)strlwr是stringlowercase(字符串小寫)的縮寫。函數(shù)的功能是將字符串中大寫字母轉(zhuǎn)換成小寫字母。(2)strupr(字符串)strupr是stringuppercase(字符串大寫)的縮寫。函數(shù)的功能是將字符串中小寫字母轉(zhuǎn)換成大寫字母。5.字符串大小寫轉(zhuǎn)換函數(shù)該類函數(shù)可以對字符串中的字符進行大小寫字母間的轉(zhuǎn)換,有兩個類型。#include<stdio.h>#include<string.h>main(){charp[5][10]={"abc","aabdfg",”abbcf''"dedbe,,,”c∥};chart[10];int
i,j;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(strcmp(p[i],p[j])>0){strcpy(t,p[i]);
strcpy(p[i],p[j]);
strcpy(p[jl,t);
}
printf("%d\n",strlen(p[0]));}程序運行后的輸出結(jié)果是____。A)2B)4C)6D)3【分析】二維字符數(shù)組按行存放字符串,將字符串從小到大排序,strcmp()函數(shù)的功能是對兩個字符串作向右逐個字符比較,直到出現(xiàn)不同的字符或遇到”\0”為止。如果全部字符都相同,則認為相等;若出現(xiàn)不同的字符,則以第一個不相同的字符的比較結(jié)果為準(zhǔn)。由此可知最小的字符串是”aabdfg”,排序后存放在p[0]中,最后在主函數(shù)中輸出p[0]的長度。故本題答案為C。【例6.26】有以下程序:6.3.4字符串處理的常用系統(tǒng)函數(shù)#include"stdio.h"main(){charstr[80],ch;
int
i,k=0;
printf("請輸入一個字符串:\n");
gets(str);
printf("請輸入要刪除的字符:\n");
ch=getchar();
for(i=0;str[i];i++)
if(str[i]!=ch)str[k++]=str[i];
str[k]='\0';
printf("輸出刪除指定字符后的字符串為:\n");
puts(str); }【例6.28】從鍵盤輸入一串字符,從中刪除指定的字符ch(要刪除的字符也從鍵盤輸入),輸出刪除指定字符后的字符串?!痉治觥勘绢}用篩法實現(xiàn),只要遍歷的字符不是字符ch,就存入字符數(shù)組中。程序代碼如下:#include<stdio.h>#include<string.h>main(){charp[20]={’a’,’b’,’c’,’d’},q[]=”abc”,r[]=”abcde”;
strcpy(p,r);
strcat(p,q);
printf(”%d%d\n",sizeof(p),strlen(p));}
程序運行后的輸出結(jié)果是()。
A)209B)99C)208D)111【分析】將r所指字符串內(nèi)容復(fù)制到p所指的存儲空間中,字符串被覆蓋。然后通過“strcat(p,q);”將q所指的字符串內(nèi)容連接到p所指的字符串后面,在輸出語句中strlen(p)是求字符串的長度,值為11;sizeof(p)用來求數(shù)組p占多少字節(jié),值為20?!纠?.27】有以下程序:#include<stdio.h>main(){charstr1[]="13579acfxyz",str2[]="02468abc";charstr[100];
int
i,j,k;i=j=k=0;while(str1[i]&&str2[j]){if(str1[i]<str2[j])
str[k++]=str1[i++];elsestr[k++]=str2[j++]; }while(str1[i])str[k++]=str1[i++];while(str2[j])str[k++]=str2[j++];
str[k]='\0';
puts(str);}【例6.29】已知str1[]=”13579acfxyz”,str2[]=”02468abc”,
請將這兩個字符串合并到字符型數(shù)組str中,使得str中的字符仍然保持升序?!痉治觥勘绢}主要的知識點是數(shù)組的歸并。程序代碼如下:【例6.30】已知十個同學(xué)參加了期中考試,他們的姓名和對應(yīng)的成績總分存入了如下數(shù)組:charxm[10][9]={"張三","李小四","王老二","袁大大","孟思五","石陽陽","趙偉偉","劉青青","吳峰峰","馬清清"};intzf[10]={523,563,542,519,500,497,598,602,538,542};請根據(jù)總分由高到低進行排名,并打印出每位同學(xué)的名次表。【分析】排名次的方法主要有兩種方法實現(xiàn),一種是先排序再填入名次;另一種是不排序直接填入名次。本題采用的方法是第二種:即假設(shè)每個人都是第一名,然后和所有人比較,有一個比zf[i]高,zf[i]的名次就后退一名。#include"stdio.h"main(){charls[9],xm[10][9]={"張三","李小四","王老二","袁大大","孟思五","石陽陽","趙偉偉","劉青青","吳峰峰","馬清清"};
intzf[10]={523,563,542,519,500,497,598,602,538,542};
intmc[10]={0};int
i,j,t,k;
for(i=0;i<10;i++){k=1;//假設(shè)每個人都是第一名
for(j=0;j<10;j++)
if(zf[j]>zf[i])k++;
mc[i]=k;}//打印各人的名次表
printf("姓名\t總分\t名次\n");
for(i=0;i<10;i++)
printf("%s\t%d\t%d\n",xm[i],zf[i],mc[i]);}程序代碼如下:#include"stdio.h"main(){chara[]="Thisisabook.sadfs,sfs,safsd,fdsf,sfsdf,df,t";
int
gs=0,i,j;//gs表示個數(shù)
int
dcksbj=0;//dcksbj表示單詞開始標(biāo)記
int
maxlen=0;//maxlen表示最長單詞的長度
int
dclen=0;//dclen表示單詞長度
int
溫馨提示
- 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年職業(yè)健康監(jiān)督管理培訓(xùn)教材
- 安全質(zhì)量領(lǐng)域系列課件《新安全生產(chǎn)法》
- 安全環(huán)保-特殊交通環(huán)境行駛的特點及注意事項
- 礦井火災(zāi)束管監(jiān)測系統(tǒng)的組成
- 專業(yè)解析農(nóng)作物種子繁育員資格考試試題及答案
- 大數(shù)據(jù)數(shù)據(jù)挖掘模型強化學(xué)習(xí)模型重點基礎(chǔ)知識點
- 了解游泳救生員考核試題及答案
- 2024年游泳救生員考試新觀察試題及答案
- 農(nóng)作物種子繁育員必要的市場分析工具試題及答案
- 2024年裁判員等級考試難題解答與試題及答案
- 2024年全國高中數(shù)學(xué)聯(lián)賽(四川預(yù)賽)試題含答案
- 骨腫瘤放射治療2025指南
- DB12T 1432-2025 城市道路交通標(biāo)線設(shè)置規(guī)范
- 2025年水電項目自動化控制系統(tǒng)安裝合同4篇
- 旅游行業(yè)行程變更及退費免責(zé)條款
- 2025年華潤電力控股有限公司招聘筆試參考題庫含答案解析
- 化工廠環(huán)保知識培訓(xùn)課件
- 2023托福聽力高分筆記
- 2025年杭州市蕭山區(qū)國企招聘筆試參考題庫含答案解析
- 2025年中國華電招聘筆試參考題庫含答案解析
- 專題12:賓語從句 -2023年中考英語考試研究(解析版)(上海專用)
評論
0/150
提交評論