




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
§6.3字符數組6.3.1字符數組的定義與初始化1.字符數組的定義字符數組的定義方法式與前面介紹的其他類型的數組定義方法完全相同。例如:charc[10];由于字符型和整型通用,也可以定義為intc[10],但這時每個數組元素占2個字節的內存單元。字符數組也可以是二維或多維數組。例如:charc[5][10];定義了5行10列的二維字符數組c。字符數組也允許在定義時作初始化賦值。例如: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’;c[8]的值為‘m’。其中c[9]未賦值,c[9]的值由系統自動賦予0值,即為’\0’。當對全體元素賦初值時也可以省去長度說明。例如:charc[]={'c','','p','r','o','g','r','a','m'};這時c數組的長度自動定為9。字符型的二維數組,可以用來存放更多的字符串。以下兩個字符串的功能等效: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.字符數組的初始化用來存放char類型數據的數組稱為字符數組。數組的每個元素都是一個char類型的字符。字符串是這樣一串字符,前面由若干個字符組成,最后一個字符是’\0’,作為字符串的結束標識。在程序中,字符數組可以存放字符,也可以存放字符串。一維數組可以存放字符串,二維數組也可以存放字符串,二維數組中每行存放一個字符串。不管字符數組中存放的是字符還是字符串,數組中每個元素都可以作為一個字符變量來引用,但是對于存放字符串的字符數組,系統提供了一些特殊的處理方法和處理函數。6.3.2字符數組的引用
1.字符數組的賦值(1)給字符串賦初值
charsl[]={’a’,’b’,’c’,’d’,’e’,’\0’);chars2[]=”12345”;
//系統自動在末尾加了一個’\0’(2)從鍵盤逐個字符輸入,最后人工補’\0’,例如:
for(i=0;i<n;i++)
sl[i]=getchar();//從鍵盤輸入
sl[n]=’\0’;//人為加上串結束標志或
for(i=0;i<n;i++)
scanf(”%c”,&s2[i]);
//從鍵盤輸入
s2[n]=’\0’;
//人為加上串結束標志(3)使用格式符“%s”,通過scanf函數,將整個字符串一次輸入。
scanf(“%s”,s3);
輸入的連續字符作為一個字符串,賦值給字符型的數組s3,注意:字符串中間不能帶有空格。空格作為多個字符串輸入的分隔符,該語句可以一次輸入多個字符串。(4)字符串輸入gets()函數。例如:
gets(sl);從鍵盤輸入,字符串中間可以帶空格。該函數只能輸入一個字符串。(1)用循環逐個輸出
for(i=0;i<n;i++)
putchar(sl[i]);//逐個輸出(2)使用格式符“%s”,通過printf函數,將整個字符串一次輸出。
printf(“%s”,s3);
在屏幕上輸出一個字符串。(3)用puts()函數整體輸出
puts(s2);//整體輸出在屏幕上輸出一個字符串,該函數會自動將字符串末尾的\0轉換成換行符輸出。即自動換行。2.字符數組的輸出#include<stdio.h>main(){charst[15];
printf("inputstring:");
scanf("%s",st);
printf("yourstringis:%s\n",st);return0;}本例中由于定義數組長度為15,因此輸入的字符串長度必須小于15,以留出一個字節用于存放字符串結束標志`\0`。應該說明的是,對一個字符數組,如果不作初始化賦值,則必須說明數組長度。還應該特別注意的是,當用scanf函數輸入字符串時,字符串中不能含有空格,否則將以空格作為串的結束符。【例6.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】輸出字符數組中的元素。本程序分別設了四個數組,輸入的一行字符的空格分段分別裝入四個數組。然后分別輸出這四個數組中的字符串。在前面介紹過,scanf的各輸入項必須以地址方式出現,如&a、&b等。但在前例中卻是以數組名方式出現的,這是為什么呢?這是由于在C語言中規定,數組名就代表了該數組的首地址。整個數組是以首地址開頭的一塊連續的內存單元。如有字符數組charc[10],在內存可表示如表6-2-3:
設數組c的首地址為2000,也就是說c[0]單元地址為2000。則數組名c就代表這個首地址。因此在c前面不能再加地址運算符&。如寫作scanf("%s",&c);則是錯誤的。在執行函數printf("%s",c)時,按數組名c找到首地址,然后逐個輸出數組中各個字符直到遇到字符串終止標志'\0'為止。表6-2-3字符數組在內存中的表示#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);}例如當輸入的字符串中含有空格時,運行情況為:inputstring:thisisabook輸出為:yourstring:this從輸出結果可以看出空格以后的字符都未能輸出。為了避免這種情況,可多設幾個字符數組分段存放含空格的串。程序可改寫如下:6.3.3 字符串與字符數組在C語言中沒有專門的字符串變量,通常用一個字符數組來存放一個字符串。前面介紹字符串常量時,已說明字符串總是以'\0'作為串的結束符。因此當把一個字符串存入一個數組時,也把結束符'\0'存入數組,并以此作為該字符串是否結束的標志。有了'\0'標志后,就不必再用字符數組的長度來判斷字符串的長度了。
C語言允許用字符串的方式對數組作初始化賦值。例如:charc[]={'c','','p','r','o','g','r','a','m'};
可寫為:charc[]={"Cprogram"};
或去掉{}寫為:charc[]="Cprogram";
用字符串方式賦值比用字符逐個賦值要多占一個字節,用于存放字符串結束標志'\0'。上面的數組c在內存中的實際存放情況如表6-2-4所示:‘\0'是由C編譯系統自動加上的。由于采用了‘\0'標志,所以在用字符串賦初值時一般無須指定數組的長度,而由系統自行處理。表6-2-4數組c在內存中的存放情況6.3.4字符串處理的常用系統函數在實際應用中,經常要對字符串進行長度計算、復制、比較、合并、大小寫轉換等操作,為此C語言提供了豐富的字符串處理函數。有了這些函數,可以直接調用系統函數完成字符串的處理,大大提高程序設計的效率。使用這些字符串函數前,就包含相應的頭文件:string.h。即在程序頭加上:#include<string.h>將字符串2復制到字符數組1中去(即給一個字符數組賦值)。(1)字符數組1必須定義得足夠大,以便容納被復制的字符串,至少應不小于字符串2的長度。(2)字符數組1必須寫成數組名形式,字符串2可以是字符數組名,也可以是一個字符串常量。(3)字符串2后面的’\0’也一同被復制到字符數組1中。(4)不能用賦值語句將一個字符串常量或字符數組直接賦值給一個字符數組。1.字符串復制(拷貝)函數strcpy(字符數組1,字符串2)【例6.25】閱讀程序分析運行結果:#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);}程序運行結果為:連接兩個字符數組中的字符串,把字符串2接到字符串1的后面,結果存在字符數組1中,函數調用后返回字符數組1的地址。(1)字符數組l必須足夠大,以便容納連接后的新字符串。(2)連接前兩個字符串的后面都有一個’\0’,連接時前一個字符串1的結束符’\0’被取消,只在新字符串末尾保留一個’\0’。2.字符串連接函數strcat(字符數組1,字符數組2)測試字符串的實際長度,返回值為字符串的實際長度,其中不包括結束符’\0’。3.求字符串長度函數strlen(字符串)按字典順序比較字符串1和字符串2,即對兩個字符串自左至右逐個字符相比較(按ASCII碼值大小比較),直到出現不同的字符或遇到’\0’為止。比較結果返回一個函數值。如果:
(1)字符串1=-字符串2,函數返回值為O。
(2)字符串1>字符串2,函數返回一個正數。
(3)字符串1<字符串2,函數返回一個負數。注意:不能用關系運算符比較兩個字符串。假定cl和c2是兩個字符串,則以下寫法是錯誤的:
if(cl==c2)prinf("yes");而只能用:
if(strcmp(cl,c2)==O)prinf("yes");4.字符串比較函數strcmp(字符串1,字符串2)(1)strlwr(字符串)strlwr是stringlowercase(字符串小寫)的縮寫。函數的功能是將字符串中大寫字母轉換成小寫字母。(2)strupr(字符串)strupr是stringuppercase(字符串大寫)的縮寫。函數的功能是將字符串中小寫字母轉換成大寫字母。5.字符串大小寫轉換函數該類函數可以對字符串中的字符進行大小寫字母間的轉換,有兩個類型。#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]));}程序運行后的輸出結果是____。A)2B)4C)6D)3【分析】二維字符數組按行存放字符串,將字符串從小到大排序,strcmp()函數的功能是對兩個字符串作向右逐個字符比較,直到出現不同的字符或遇到”\0”為止。如果全部字符都相同,則認為相等;若出現不同的字符,則以第一個不相同的字符的比較結果為準。由此可知最小的字符串是”aabdfg”,排序后存放在p[0]中,最后在主函數中輸出p[0]的長度。故本題答案為C。【例6.26】有以下程序:6.3.4字符串處理的常用系統函數#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(要刪除的字符也從鍵盤輸入),輸出刪除指定字符后的字符串。【分析】本題用篩法實現,只要遍歷的字符不是字符ch,就存入字符數組中。程序代碼如下:#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));}
程序運行后的輸出結果是()。
A)209B)99C)208D)111【分析】將r所指字符串內容復制到p所指的存儲空間中,字符串被覆蓋。然后通過“strcat(p,q);”將q所指的字符串內容連接到p所指的字符串后面,在輸出語句中strlen(p)是求字符串的長度,值為11;sizeof(p)用來求數組p占多少字節,值為20。【例6.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”,
請將這兩個字符串合并到字符型數組str中,使得str中的字符仍然保持升序。【分析】本題主要的知識點是數組的歸并。程序代碼如下:【例6.30】已知十個同學參加了期中考試,他們的姓名和對應的成績總分存入了如下數組:charxm[10][9]={"張三","李小四","王老二","袁大大","孟思五","石陽陽","趙偉偉","劉青青","吳峰峰","馬清清"};intzf[10]={523,563,542,519,500,497,598,602,538,542};請根據總分由高到低進行排名,并打印出每位同學的名次表。【分析】排名次的方法主要有兩種方法實現,一種是先排序再填入名次;另一種是不排序直接填入名次。本題采用的方法是第二種:即假設每個人都是第一名,然后和所有人比較,有一個比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;//假設每個人都是第一名
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表示個數
int
dcksbj=0;//dcksbj表示單詞開始標記
int
maxlen=0;//maxlen表示最長單詞的長度
int
dclen=0;//dclen表示單詞長度
int
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 藥品購銷管理管理制度
- 藥品風險放行管理制度
- 藥店復方制劑管理制度
- 藥店藥品售后管理制度
- 螢石監控中心管理制度
- 設備儀器適用管理制度
- 設備固定資產管理制度
- 設備技改創新管理制度
- 設備檢修操作管理制度
- 設備租賃單位管理制度
- 濕熱滅菌工藝驗證方案1
- 2024年廣東省初中學業水平考試生物押題卷
- MOOC 人格與人生-蘇州城市學院 中國大學慕課答案
- 經濟學思維方式智慧樹知到期末考試答案2024年
- 網絡安全知識競賽考試題庫300題(含答案)
- 國開電大2023年春季期末考試《機械CAD、CAM》試題及答案(試卷代號1119)
- 審計 第7版 課件 第10章采購與付款循環審計
- (高清版)DZT 0145-2017 土壤地球化學測量規程
- 口腔科醫師職責
- 四年級語文 囊螢夜讀微課-“江南聯賽”一等獎
- 八年級親子共評
評論
0/150
提交評論