第十二章字符串_第1頁
第十二章字符串_第2頁
第十二章字符串_第3頁
第十二章字符串_第4頁
第十二章字符串_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、12.1 字符串的存儲形式 字符串常量 C語言中沒有字符串?dāng)?shù)據(jù)類型,但是, C語言中卻有“字符串常量”。在C語言 中,以雙引號括起來的、由若干個字符 組成的序列即為字符串常量,如“spels” 即為一個字符串。 在存儲字符串時,C語言編譯系統(tǒng)會在字符 串最后自動加上0作為該字符串的結(jié)尾 符。0是一個轉(zhuǎn)義字符,在前面提到過, 它的ASCII為0,也稱為“空值”。如下圖 所示是字符串“spels”在內(nèi)存中的存儲形式。 可以看到字符串結(jié)尾已經(jīng)被自動加上了字 符0,而且我們可以看出,該字符串長 度為5(字符串長度不包括結(jié)尾符0), 而在內(nèi)存中卻需要6個字節(jié)來存放該字符串 (C語言中,一個字符是用一個字

2、節(jié)來存放 的)。 spels0 通過一維字符數(shù)組可以處理字符串。C語言 中的字符數(shù)組,每個數(shù)組元素都是一個字 符,當(dāng)這些數(shù)組元素的最后一個字符是0 時,我們就認(rèn)為該字符數(shù)組保存的是一個 字符串。比如以下例子: 例12.1 char str10=s, p, e, l, s, 0; 由數(shù)組的知識我們可以知道,該字符型數(shù) 組的前5個元素(str0到str4)分別被賦 了5個字符s, p, e, l和s,第5個元素 (str5)被賦了空值0。這樣該數(shù)組在內(nèi) 存中的存儲形式如下圖所示。 spels00000 因為str數(shù)組中第5個數(shù)組元素str5存放 了0這個字符串結(jié)尾符,所以我們可以 說str字符數(shù)組

3、存放的就是“spels”字符串。 通過賦值,我們可以讓一個字符數(shù)組存放一個 字符串。我們有以下幾種賦值方式。 通過對單個數(shù)組元素賦值 例12.2 char str10; str0=s; str1=p; str2=e; str3=l; str4=s; str5=0; (1)字符數(shù)組大小必須定義足夠大,以便能 夠保存后面給出的字符串常量,同時要考 慮到字符串結(jié)尾符0也占用了一個字節(jié), 因此字符串的長度必須小于字符數(shù)組的大 小。 (2)在字符串的末尾必須賦空值0,用以表 示字符串結(jié)束。 在上面的例子中,字符串“spels”的長度是 5,而數(shù)組str的大小為10,符合上面的要求。 例12.3 char

4、 str10=s,p,e,l,s; 當(dāng)賦值的個數(shù)少于所定義數(shù)組的元素個數(shù) 時,將自動給后面的元素補(bǔ)以初值0。 例12.4 char str=s,p,e,l,s,0; 字符數(shù)組str存放的是“spels”字符串,str字 符串的長度是5。在定義str數(shù)組時,沒有指 定該數(shù)組的大小,因此該數(shù)組大小系統(tǒng)默 認(rèn)為6。 例12.5 char str10=“spels”; 或 char str10=“spels”; 在例12.5中是在字符數(shù)組定義時對其進(jìn)行初始化, 把一個字符串常量直接賦給數(shù)組。它的存儲方式 與例12.1中的數(shù)組str相同。 注意:例12.3、例12.4、例12.5均是在字符數(shù)組進(jìn) 行定義

5、時賦初值,如果不是在定義時賦初值,必 須遵照例12.2的方法單個元素逐個賦值。例如以 下的賦值語句是錯誤的: char str10; str=“spels”; 在C語言中,可以通過字符指針來處理字符 串。 例12.6 char *p=“spels”; 在例12.6中,我們把“spels”這個字符串賦 值給了字符指針p,其實質(zhì)是把保存字符串 “spels”的那段內(nèi)存的首地址賦給了指針p。 使得指針p指向了字符串“spels”,我們就 可以通過指針p來處理字符串”spels”。 例12.7 char *p; p=“spels”; 先定義字符指針p,然后再把字符串“spels”賦給 p,以使字符指針

6、p指向字符串”spels”。 在例12.6、例12.7中,指針p處理的都是字符串 “spels”,p的字符串長度是5。 例12.8 char str10; str=“spels”; 例12.8是一個錯誤的例子,因為str是一個字符數(shù) 組,數(shù)組名是一個指針常量。第二條語句 str=“spels”;相當(dāng)于把字符串”spels”的首地址賦 給str,試圖改變str的值。但str是指針常量,其值 不能改變,所以會發(fā)生錯誤。 例12.9 char str=“spels”, *pstr=“spels”; 例12.9中分別定義了字符數(shù)組str和字符指 針pstr,且處理的都是“spels”字符串,但 在內(nèi)存

7、中,它們的處理方式不一樣的。開 辟內(nèi)存單元如下所示。 數(shù)組str: 指針pstr: pstr: spels0 spe l s0 使用printf函數(shù)輸出字符串 在printf的輸出格式中,%s代表字符串,可以通 過該格式輸出字符串。如下例: 例12.10 char str=“Hello, Spels!”; printf(“%s”,str); 在該例中,數(shù)組str存放的是一個字符串。當(dāng)調(diào) 用printf函數(shù)對該數(shù)組使用%s格式進(jìn)行輸出時, 系統(tǒng)將把字符串中的字符按順序輸出到屏幕上, 直到遇到0為止。輸出結(jié)果如下: Hello, Spels! 例12.11 char str1=“Hello,Spe

8、ls!”; printf(“%s”,str1+6); 該例的輸出結(jié)果是: Spels! 根據(jù)指針的知識我們可以知道,str1+6是指 向str6的指針。把str1+6作為字符串進(jìn)行 輸出時,系統(tǒng)把str1+6當(dāng)作該字符串的首地 址,所以會得到如上輸出。 例12.12 char str1=“Hello0,Spels!”; printf(“%s”,str1); 輸出結(jié)果如下: Hello 注意:在Hello后面是一個控制0,因此字符 串str1實際上是“Hello”。 程序在使用puts來對字符串進(jìn)行輸出時,要在程 序中包含頭文件stdio.h。 puts函數(shù)在輸出完字符串后,會自動輸出一個換 行

9、符。puts的調(diào)用格式: puts(字符串首地址); 例12.13 char *pstr=“Hello, Spels!”; puts(pstr); 程序輸出結(jié)果如下: Hello, Spels! 在輸出完字符串后,系統(tǒng)會自動輸出一個換行符, 是屏幕上的光標(biāo)跳到下一行。 一. 輸入字符串的必要條件 當(dāng)對字符串進(jìn)行輸入時,輸入項可以是一 個字符數(shù)組名,這樣輸入的字符串將存放到 該數(shù)組中,此時數(shù)組應(yīng)該足夠大,以能保存 輸入的字符串;輸入項還可以是字符指針, 這里的字符指針必須是指向確切的、足夠大 的存儲空間,以便輸入的字符串可以存放到 該指針?biāo)赶虻膬?nèi)存空間中。 在scanf中,可以使用格式%s來輸

10、入一個字符串。 例12.14 char str20; scanf(“%s”,str); 以上程序運(yùn)行后,從鍵盤輸入: spels(此處CR代表Enter) 則輸入的字符串從str0開始依次放入數(shù)組str中, 在最后一個字符!后,系統(tǒng)會自動在數(shù)組后 面加上0。 (1)使用scanf通過%s格式進(jìn)行輸入時,輸 入的空格和回車都會被認(rèn)為是數(shù)據(jù)的分隔 符,而不作為數(shù)據(jù)被讀入。 (2)如果輸入項是數(shù)組元素的地址時,輸入 數(shù)據(jù)將從這一地址開始存放。 程序在使用gets來對字符串進(jìn)行輸入時,要在程 序中包含頭文件stdio.h。 gets函數(shù)的調(diào)用格式: gets(待輸入字符串首地址); 例12.15 ch

11、ar str120; gets(str1); 執(zhí)行上面語句,若從鍵盤輸入: Hi spels 系統(tǒng)將讀入10個字符,包括空格和回車符,依次 存放在數(shù)組str中,系統(tǒng)自動用0來取代最后的 回車符。 字符串?dāng)?shù)組,即數(shù)組中的每一個元素存放 的都是一個字符串。在C語言中,可以通過 二維字符數(shù)組或一維指針數(shù)組處理。 一. 二維字符數(shù)組存放字符串?dāng)?shù)組 通過前面的學(xué)習(xí),我們可以把二維數(shù)組 看作是一個一維數(shù)組,該數(shù)組的每一個元 素又是一個一維數(shù)組。假如這些一維數(shù)組 中存放的都是字符串,那么這個二維數(shù)組 保存的就是一個字符串?dāng)?shù)組。 如:char str520; 我們可以把這個二維數(shù)組看作是一個由5個字符串 組成

12、的一維數(shù)組,每個字符串的長度最大可以是 19個字符。 例12.16 char name420=“I”,”am”,”a”,”teacher”; 或 char name20=“I”,”am”,”a”,”teacher”; 例12.16中,二維數(shù)組name存放的就是一個字符串 數(shù)組。name0、name1、name2、name3分 別存放了“I”,”am”,”a”,”teacher”四個字符串???以調(diào)用puts(namei)來對以上字符串進(jìn)行輸出, 其中i的取值應(yīng)該在01之間。 可以定義一個一維字符指針數(shù)組,來處理字符串?dāng)?shù)組。若 字符指針數(shù)組中的每一個元素都指向一個字符串,即可以 認(rèn)為該指針數(shù)組處

13、理的是一個字符串?dāng)?shù)組。 char *pname4= “I”,”am”,”a”,”teacher”; 或char *pname= “I”,”am”,”a”,”teacher”; pname中的四個元素pname0 、pname1、 pname2、 pname3分別指向字符串“I”,”am”,”a”,”teacher”。系統(tǒng)通 過無名的一維數(shù)組來存儲這些字符串,各字符串之間并不 一定占用連續(xù)的存儲單元。一旦pname中的元素重新賦值, 如果沒有其它字符指針指向相應(yīng)的字符串,則相應(yīng)的字符 串就會丟失。可以通過pnamei來引用上述中的字符串, 或者通過pnameij來引用該字符串中的字符。 一. 字

14、符串拷貝 例12.17 編寫函數(shù)strcopy(char *d,char *s), 將指針s所指向的字符串復(fù)制到指針d 所指向的存儲空間中。 char *strcopy(char *d, char *s) char *p=d; while(*s!=0) *p=*s; p+; s+; *p=0; return d; 復(fù)制字符串,就是把s所指向的字符串,逐 個的賦給d所指向的存儲空間。C語言系統(tǒng) 為用戶提供了庫函數(shù)strcpy可以實現(xiàn)字符拷 貝的功能。strcpy的調(diào)用格式: strcpy(d,s); 此函數(shù)把s指向的字符串拷貝復(fù)制到d指向 存儲空間。注意:在調(diào)用這個函數(shù)時,程 序必須包含stri

15、ng.h頭文件。同時為了保證 賦值的合法性,d所指向的空間長度必須足 夠容納s串。 例12.18 編寫函數(shù)strlength(char *str),求字符串str 的字符串長度。 int strlength(char *str) int i=0; while(stri!=0) i+; return i; C語言系統(tǒng)為用戶提供了庫函數(shù)strlen可以 實現(xiàn)以上函數(shù)功能。strlen的調(diào)用格式為: strlen(s); 此函數(shù)返回s指向的字符串的長度??梢园?該函數(shù)的返回值賦給一個整型變量,如 len=strlen(s); 注意:在調(diào)用這個函數(shù)時,程序必須包含頭 文件string.h頭文件。 例1

16、2.19 編寫函數(shù)strcatt(char *d, char *s),將s指向的字符復(fù)制到d所指向字符串 的后面。 void strcatt(char *d, char *s) int len; len=strlen(d); d+=len; while(*s!=0) *d=*s; d+; s+; *d=0; 該函數(shù)先求出d字符串的長度,然后把指針d移動 到字符串d的末尾,最后通過while循環(huán)把s所指向 的字符串的字符依次賦給d指向的字符串的后面。 C語言系統(tǒng)為用戶提供了庫函數(shù)strcat可以實現(xiàn)以 上函數(shù)功能。strcat調(diào)用格式為: strcat(d,s); 此函數(shù)把s指向的字符串復(fù)制到d指向的字符串的 后面

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論