版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第9章字符串字符串是C語言中另一種常用的數(shù)值對(duì)象,可以用來表示若干個(gè)字符的集合。在C語言的實(shí)現(xiàn)中,字符串與字符數(shù)組有著緊密的聯(lián)系。讀者在學(xué)習(xí)字符串的時(shí)候要注意兩者的異同點(diǎn)。在第8章中已經(jīng)介紹了數(shù)組,并且涉及了字符數(shù)組的一些簡單使用。本章將詳細(xì)討論字符數(shù)組和字符串的使用,同時(shí)還將介紹字符串的格式化輸入輸出函數(shù)的使用。第9章字符串通過本章的學(xué)習(xí),需要掌握以下知識(shí)點(diǎn):字符數(shù)組的使用;字符串和字符數(shù)組的關(guān)系;字符串常量和字符串變量的使用;字符串終止符’\0’的作用;使用printf函數(shù)和scanf函數(shù)處理字符串。9.1字符數(shù)組字符數(shù)組,即char型數(shù)組,是用以存放char型數(shù)據(jù)的數(shù)組容器。它的定義和使用與其他類型的數(shù)組基本相似。本小節(jié)將先介紹如何字符數(shù)組的定義和賦值,再討論初始化數(shù)組的方法,并在此基礎(chǔ)上介紹二維字符數(shù)組的使用,最后通過幾個(gè)范例來演示字符數(shù)組的使用。9.1.1定義和賦值字符數(shù)組字符數(shù)組的定義與其他數(shù)據(jù)類型的數(shù)組定義類似,需要首先指定數(shù)組容量。標(biāo)準(zhǔn)形式如下:char數(shù)組名[數(shù)組容量];其中,為了提高程序可維護(hù)性,一般使用具名常量作為數(shù)組容量。在數(shù)組定義后對(duì)數(shù)組賦值,只能通過對(duì)其中的每個(gè)元素挨個(gè)賦值的方式進(jìn)行。例如:01 chararray_ch[6];02 03 array_ch[0]=‘S’;04 array_ch[1]=‘u’;05 array_ch[2]=‘n’;06 array_ch[3]=‘d’;07 array_ch[4]=‘a(chǎn)’;08 array_ch[5]=‘y’;9.1.1定義和賦值字符數(shù)組以上語句將array_ch定義為字符數(shù)組,并對(duì)其中的元素挨個(gè)賦值,如果數(shù)組內(nèi)的元素具有某種規(guī)律性,還可以使用循環(huán)語句來為字符數(shù)組賦值。這種賦值方式比較簡潔。例如,要把一個(gè)數(shù)組賦值為’a’到’z’,可以使用如下代碼:01 #defineMAX_CHAR2602 …03 inti=0;04 chararray_ch[MAX_CHAR];05 06 for(i=0;i<MAX_CHAR;++i){07 array_ch[i]=‘a(chǎn)’+i;08 }9.1.1定義和賦值字符數(shù)組上述語句將數(shù)組array_ch的元素挨個(gè)賦值為’a’~’z’。注意:定義字符數(shù)組時(shí),同樣要求指定數(shù)組容量大小,并且必須使用常量來表示。由于char型可以視為字長為1個(gè)字節(jié)的整數(shù),所以也可以使用整型數(shù)組來存儲(chǔ)字符。但是,由于int型數(shù)據(jù)類型占用4個(gè)字節(jié),而char型數(shù)據(jù)類型只占用1個(gè)字節(jié),因此使用int型數(shù)組會(huì)浪費(fèi)空間。范例9-1展示了如何使用字符數(shù)組和int型數(shù)組來存儲(chǔ)字符。9.1.2字符數(shù)組的初始化與其他變量一樣,使用字符型數(shù)組也應(yīng)當(dāng)對(duì)其初始化。字符型數(shù)組的初始化方法與上一章介紹的數(shù)組的初始化一樣,有3種方法:1.初始化所有元素在數(shù)組定義語句中為所有數(shù)組元素賦值,如下:chararray[6]={‘S’,‘u’,‘n’,‘d’,‘a(chǎn)’,‘y’};charstr[4]={‘g’,‘o’,‘o’,‘d’};上述兩個(gè)語句將數(shù)組array和str的全部元素初始化。9.1.2字符數(shù)組的初始化2.初始化部分元素初始化值序列只給數(shù)組的前一部分值。如下:chararray[6]={‘S’};charstr[4]={‘g’,‘o’};上述兩個(gè)語句雖然只將數(shù)組的前一部分元素顯式初始化,但是編譯器會(huì)將其它部分自動(dòng)初始化為0。其中,array[1]、array[2]、array[3]、array[4]和array[5]全為0,str[2]和str[3]全為0。9.1.2字符數(shù)組的初始化3.不指定數(shù)組容量初始化數(shù)組時(shí)還可以不指定數(shù)組容量,而只給出初始化值序列,由初始值序列的個(gè)數(shù)決定數(shù)組容量,例如:chararray[]={‘S’};charstr[]={‘g’,‘o’};上述初始化語句執(zhí)行后,字符數(shù)組array的容量被設(shè)為1,只含一個(gè)元素’S’;字符數(shù)組str的容量被設(shè)為2,元素分別為’g’和’o’。9.1.3二維字符數(shù)組1.二維字符數(shù)組的定義二維字符數(shù)組就是數(shù)組元素為字符的二維數(shù)組。與定義其他類型的二維數(shù)組一樣,定義二維字符數(shù)組也必須指定各個(gè)維數(shù)的容量,其標(biāo)準(zhǔn)形式如下:char數(shù)組名[容量1][容量2];例如:charq[3][4];變量q被定義為字符數(shù)組,并占用3×4的數(shù)組空間。9.1.3二維字符數(shù)組2.二維字符數(shù)組的賦值同樣二維字符數(shù)組的賦值也必須通過訪問其中的每個(gè)元素來進(jìn)行。例如:q[2][3]=‘a(chǎn)’;q[1][1]=‘b’;其中,二維字符數(shù)組q的第2排第3列元素(均從0開始編號(hào))被設(shè)為字符’a’,數(shù)組中的第1排第1列元素被設(shè)為’b’。9.1.3二維字符數(shù)組3.二維字符數(shù)組的初始化二維字符數(shù)組的初始化與一維數(shù)組初始化類似,也可以通過三種方式進(jìn)行初始化。例如:01 charq[2][2]={{‘a(chǎn)’,‘b’},{‘c’,‘d’}}; /*方式一:初始化所有元素*/02 charp[4][4]={ /*方式二:初始化所有一維數(shù)組的部分元素*/03 {‘a(chǎn)’,‘b’,‘c’},04 {‘e’,‘f’,},05 {‘g’},06 {}};07 charw[][]={ /*方式三:初始化部分一維數(shù)組*/08 {‘a(chǎn)’,‘b’,‘o’,‘u’,‘t’},09 {‘!’}};9.1.4字符數(shù)組使用舉例下面通過兩個(gè)字符數(shù)組的案例來討論如何在C語言中有效地使用字符數(shù)組。1.翻轉(zhuǎn)單詞本案例要求使用一個(gè)字符串?dāng)?shù)組實(shí)現(xiàn)將一個(gè)單詞的字符翻轉(zhuǎn)的功能,并要求將結(jié)果存儲(chǔ)在原來的字符數(shù)組中。例如,如果一個(gè)單詞為“GoodBye”,翻轉(zhuǎn)后為“eyBdooG”。對(duì)于這個(gè)問題,方法之一是引入一個(gè)臨時(shí)數(shù)組,可以分兩個(gè)步驟來解決問題:9.1.4字符數(shù)組使用舉例(1)借助一個(gè)臨時(shí)字符數(shù)組,將原字符數(shù)組的內(nèi)容按相反的順序存儲(chǔ)在該臨時(shí)字符中。該步完成后,兩個(gè)數(shù)組的內(nèi)容如下圖所示。9.1.4字符數(shù)組使用舉例(2)將該臨時(shí)數(shù)組的內(nèi)容順序復(fù)制回原數(shù)組中。該步驟完成后,兩個(gè)數(shù)組的內(nèi)容如下圖所示。9.1.4字符數(shù)組使用舉例2.翻轉(zhuǎn)單詞的另一種實(shí)現(xiàn)由于上一種方法引入了一個(gè)臨時(shí)數(shù)組,因此會(huì)占用額外的內(nèi)存空間。這里將介紹另一種不需要借助其他數(shù)組,只在原數(shù)組上進(jìn)行操作而實(shí)現(xiàn)翻轉(zhuǎn)單詞功能的方法。9.1.4字符數(shù)組使用舉例由于單詞順序存儲(chǔ)在一個(gè)數(shù)組內(nèi),對(duì)其進(jìn)行翻轉(zhuǎn)實(shí)際上等效于,將其前后調(diào)換:第一個(gè)字符和倒數(shù)一個(gè)交換,第二個(gè)字符和倒數(shù)第二個(gè)字符交換,第三個(gè)字符和倒數(shù)第三個(gè)字符交換……直到字符數(shù)組的中間,假設(shè)為第n個(gè)字符。如果該字符數(shù)為奇數(shù),則正好只剩一個(gè)字符;如果為偶數(shù),則剩為兩個(gè)字符。但是不論哪種情況,都可以照樣將第n個(gè)字符和倒數(shù)第n個(gè)字符交換,如果是只有一個(gè)字符,就是自己和自己交換,不會(huì)影響功能。9.1.4字符數(shù)組使用舉例該方法的實(shí)現(xiàn)過程如下圖所示。9.2字符串常量與字符串變量為了更方便地對(duì)字符數(shù)據(jù)集合進(jìn)行處理,C語言引入了字符串類型。本節(jié)將討論字符串與字符數(shù)組的關(guān)系,首先依次介紹了字符串常量和字符串變量的使用,并通過幾個(gè)范例來演示如何字符串的格式化輸入輸出。9.2.1字符串常量C語言中的字符串常量是指用以表示字符串?dāng)?shù)據(jù)的常量,是包含在引號(hào)里的字符的集合。在前面的程序中,已經(jīng)接觸到很多的字符串常量,例如:“Hello,world!\n”“a=%d”“Thisisaprogram.”這三個(gè)都是字符串常量。字符串常量在C語言中被處理為一維字符數(shù)組存儲(chǔ)在內(nèi)存中一塊連續(xù)的區(qū)域內(nèi)。9.2.1字符串常量例如,上面的“Hello,world!\n”(中間無空格)在內(nèi)存中的存儲(chǔ)形式如圖9-7所示。9.2.1字符串常量而有以下定義的字符數(shù)組在內(nèi)存中的存儲(chǔ)形式如下圖所示。charstr[]={‘H’,‘e’,‘l’,‘l’,‘o’,‘,’,‘w’,‘o’,‘r’,‘l’,‘d’,‘!’,‘\n’};9.2.1字符串常量C語言定義了’\0’作為字符串常量在內(nèi)存中結(jié)束的標(biāo)志。對(duì)于任何一個(gè)字符串常量,C語言存儲(chǔ)其有效內(nèi)容的同時(shí),還會(huì)在它后面加上一個(gè)’\0’。例如,字符串“Hello”的有效內(nèi)容為5個(gè)字符,將其存儲(chǔ)在內(nèi)存中時(shí),末尾會(huì)自動(dòng)追加一個(gè)’\0’,變?yōu)?個(gè)字符。其在內(nèi)存中的空間為6字節(jié)。9.2.2字符串變量字符串變量實(shí)際上就是一維字符數(shù)組。使用字符串常量初始化一維數(shù)組,便可以得到一個(gè)字符串變量。例如:charstr[13]={“GoodDay!”};該語句會(huì)將字符串“GoodDay!”的內(nèi)容賦值給字符數(shù)組str中前幾個(gè)相應(yīng)的內(nèi)存空間,即’G’、’o’、’o’、’d’、’’、’D’、’a’、’y’、’!’和’\0’被相應(yīng)賦值給字符數(shù)組str的前10個(gè)字符空間,未被明確賦值的空間被初始化為0,即’\0’。初始化后str的內(nèi)存空間如下圖所示。9.2.2字符串變量注意:字符串變量在內(nèi)存中以一維字符數(shù)組的形式存儲(chǔ)。上述初始化語句也可以省略花括號(hào),如下所示:charstr[13]=“GoodDay!”;也可以不指定數(shù)組容量,如下所示:charstr[]=“GoodDay!”;這種方式下,字符數(shù)組str的數(shù)組容量由字符串常量的字節(jié)數(shù)決定。因?yàn)椤癎oodDay!”所占空間為10個(gè)char型,所以str的容量大小為10。上述初始化語句,與以下初始化語句等效:charstr[]={‘G’,’o’,’o’,’d’,’’,’D’,’a’,’’y,’!’,’\0’};9.2.2字符串變量而以下缺少最后一個(gè)’\0’的初始化語句得到的字符數(shù)組str是不一樣的:charstr[]={‘G’,’o’,’o’,’d’,’’,’D’,’a’,’’y,’!’};該語句只能得到一個(gè)內(nèi)存空間為9個(gè)字節(jié)的字符數(shù)組。提示:字符串必須包含’\0’,其最后一個(gè)字符肯定是’\0’;而字符數(shù)組可以不要’\0’。要將字符數(shù)組初始化為全0,可以使用如下簡單形式:chararray[20]=“\0”;因?yàn)樽址癨0”的存儲(chǔ)在內(nèi)存中為兩個(gè)’\0’,所以執(zhí)行該語句后array的前兩個(gè)字符賦值\0,剩余18個(gè)字符會(huì)自動(dòng)初始化為’\0’。9.2.3格式化輸出字符串使用printf函數(shù)可以實(shí)現(xiàn)字符串的格式化輸出,其為字符串輸出提供了專門的格式符:%s。使用printf函數(shù)輸出字符數(shù)組的形式如下:printf(“%s”,str);該語句會(huì)將從地址str(數(shù)組名也是數(shù)組首地址)開始的字符依次輸出,直到遇到’\0’字符。范例9-6演示了如何使用printf函數(shù)輸出字符數(shù)組。9.2.4字符終止符的作用在前面的討論中,已經(jīng)知道’\0’符號(hào)在字符串中的作用。范例9-7進(jìn)一步演示了’\0’在使用printf函數(shù)格式化輸出字符串中的作用。9.2.5格式化輸入字符串使用scanf函數(shù)可以實(shí)現(xiàn)字符串的格式化輸入,實(shí)現(xiàn)從標(biāo)準(zhǔn)輸入為字符串變量賦值。與printf函數(shù)一樣,scanf函數(shù)提供的格式字符也為‘s’,該函數(shù)調(diào)用形式如下:scanf(“%s”,str);由于數(shù)組名就代表數(shù)組的首地址,因此該語句中不需要再對(duì)str取地址。如下形式是錯(cuò)誤的:scanf(“%s”,&str);9.2.5格式化輸入字符串該語句會(huì)以字符串的形式從標(biāo)準(zhǔn)輸入讀取數(shù)值,直到遇到空白符(包括空格符、回車符、制表符和字符串終止符)。讀取的值將會(huì)依次賦值給從地址str(變量名str也是數(shù)組首地址)開始的若干個(gè)字符空間。例如,若有輸入為:hello,world!則字符串變量(字符數(shù)組)str只能得到空格前的6個(gè)字符,而系統(tǒng)會(huì)在其有效字符后自動(dòng)增加字符串終結(jié)符’\0’。賦值的結(jié)果如右圖所示。9.2.5格式化輸入字符串也可以在一個(gè)scanf函數(shù)中給多個(gè)字符數(shù)組賦值,如下所示:scanf(“%s%s%s”,s1,s2,s3);如果輸入為:Itistimefordinner!(回車)那么,字符數(shù)組s1被賦值為“It”,字符數(shù)組s2被賦值為“is”,字符數(shù)組s3被賦值為“time”,同樣每個(gè)字符數(shù)組末尾都會(huì)自動(dòng)增加一個(gè)’\0’。9.3字符串應(yīng)用舉例字符串處理是C語言程序中十分頻繁的處理任務(wù)。為了熟悉C語言中的字符串處理方式,本小節(jié)將通過幾個(gè)字符串處理的典型范例來演示C語言中對(duì)字符串的基本操作方法。同時(shí),還介紹了字符串處理時(shí)最常用的輔助函數(shù)之一:strlen函數(shù)。9.3.1使用strlen函數(shù)strlen函數(shù)在字符串處理中是十分常用的,其功能為得到一個(gè)字符串的有效長度,即從第一個(gè)字符開始到第一個(gè)字符串終止符的字符個(gè)數(shù)(不包括字符串終止符)。其調(diào)用形式如下:a=strlen(str);執(zhí)行該語句后,strlen函數(shù)會(huì)計(jì)算字符串str的有效長度,并將該值作為函數(shù)值賦值給a。然后通過訪問a,即可獲得字符串str的有效長度。9.3.2統(tǒng)計(jì)單詞數(shù)本案例要求實(shí)現(xiàn)統(tǒng)計(jì)字符串中單詞數(shù)的功能。假定單詞之間使用空格隔開。如果輸入字符串為“dogcatwoftant”,則輸入為4個(gè)單詞?;舅惴枋鋈缦拢菏褂靡粋€(gè)游標(biāo)i從首字符向后遍歷字符串{如果i指向字符!=空格,說明這是一個(gè)單詞的開始{單詞數(shù)connt增加1;將i向后移到該單詞結(jié)束的位置,即使i指向遇到的第一個(gè)空格或字符串終止符;}i自增1;}9.3.3顛倒單詞順序本范例要求實(shí)現(xiàn)顛倒字符串中的單詞順序的功能。例如:如果輸入為“Howdoyoudo?”,則輸出“do?youdoHow”;如果輸入為“Whatagoodday!!!”,輸出為“day!!!goodaWhat”。其中,單詞之間只考慮出現(xiàn)空格符。一種比較容易想到的方法就是引入一個(gè)臨時(shí)字符數(shù)組。將逆序輸出的字符串先拷到臨時(shí)數(shù)組,再從臨時(shí)數(shù)組復(fù)制會(huì)原數(shù)組。具體步驟如下:9.3.3顛倒單詞順序(1)使用游標(biāo)從字符結(jié)尾向前搜索,每找到一個(gè)單詞都將其整個(gè)復(fù)制到臨時(shí)數(shù)組,并在每個(gè)單詞后增加一個(gè)空格(最后一個(gè)單詞加字符串終止符’\0’)。這一步驟執(zhí)行后,原數(shù)組與臨時(shí)數(shù)組的內(nèi)容狀況如下圖所示。9.3.3顛倒單詞順序(2)將臨時(shí)數(shù)組的內(nèi)容逐個(gè)字符復(fù)制到原數(shù)組。這一步驟執(zhí)行完后,兩個(gè)數(shù)組在內(nèi)存中的內(nèi)容如下圖所示。9.3.4顛倒單詞順序-改進(jìn)范例9-10的方法有兩個(gè)缺點(diǎn):由于引入了一個(gè)臨時(shí)字符串,空間復(fù)雜度高。執(zhí)行了兩次復(fù)制(從原字串到臨時(shí)字串,從臨時(shí)字串到原字串),時(shí)間復(fù)雜度高。另外一種比較靈巧且較節(jié)約空間的做法是在本數(shù)組內(nèi)實(shí)現(xiàn)單詞順序的顛倒。該方法也需要兩部來實(shí)現(xiàn)。9.3
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 鄭州工業(yè)安全職業(yè)學(xué)院《法律邏輯學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 鄭州工程技術(shù)學(xué)院《男生極限飛盤》2023-2024學(xué)年第一學(xué)期期末試卷
- 鄭州電子商務(wù)職業(yè)學(xué)院《病理生理學(xué)A》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年水稻生產(chǎn)基地與收購商保量收購合同范本3篇
- 二零二五百貨公司企業(yè)社會(huì)責(zé)任履行合同2篇
- 浙江長征職業(yè)技術(shù)學(xué)院《生物大分子制備工藝學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年度個(gè)人在線游戲虛擬貨幣購買合同范本4篇
- 個(gè)人餐飲業(yè)務(wù)承包合同樣本版B版
- 2025版美容院會(huì)員積分管理與消費(fèi)激勵(lì)合作協(xié)議4篇
- 二零二五版數(shù)字貨幣錢包技術(shù)開發(fā)與合作協(xié)議范本3篇
- 教代會(huì)提案征集培訓(xùn)
- 高考語文復(fù)習(xí)【知識(shí)精研】《千里江山圖》高考真題說題課件
- 河北省承德市2023-2024學(xué)年高一上學(xué)期期末物理試卷(含答案)
- 012主要研究者(PI)職責(zé)藥物臨床試驗(yàn)機(jī)構(gòu)GCP SOP
- 農(nóng)耕研學(xué)活動(dòng)方案種小麥
- 2024年佛山市勞動(dòng)合同條例
- 污水管網(wǎng)規(guī)劃建設(shè)方案
- 城鎮(zhèn)智慧排水系統(tǒng)技術(shù)標(biāo)準(zhǔn)
- 采購管理制度及流程采購管理制度及流程
- 五年級(jí)美術(shù)下冊(cè)第9課《寫意蔬果》-優(yōu)秀課件4人教版
- 節(jié)能降耗課件
評(píng)論
0/150
提交評(píng)論