字符串的概念_第1頁
字符串的概念_第2頁
字符串的概念_第3頁
字符串的概念_第4頁
字符串的概念_第5頁
已閱讀5頁,還剩44頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第8講字符串C++課件1字符串的概念字符串(string)是由雙引號(hào)“”所包括起來的一串文字。字符串在內(nèi)存中的儲(chǔ)存方式很特別,除了我們看到的文字外,其后還多加一個(gè)‘\0’字符,亦即空字符(NULLcharacter)。它的ASCII值為0,作為字符串的結(jié)束標(biāo)記。特別需要注意的是:英文字母,空格和標(biāo)定符號(hào)都在1個(gè)字節(jié),而每個(gè)中文占據(jù)2個(gè)字節(jié)。而對(duì)于英文字母,空格和標(biāo)定符號(hào)有兩種寫法,占1個(gè)字節(jié)的稱為ASCII碼,占兩個(gè)字節(jié)的稱為全角碼。2升達(dá)大學(xué)資訊系字符串的概念全角碼實(shí)際是緣于微軟公司在遠(yuǎn)東地區(qū)的Windows本版,它使用DBCS碼(雙字節(jié)字符集,Double-ByteCharacterSet)用來支持遠(yuǎn)東地區(qū)許多象形文字的表達(dá),如中文,日文,韓文等。在這種字符集中大于128的ASCII碼字符作為前導(dǎo)字符(而這部分字符通常不顯示),并不代表實(shí)際意義,而是會(huì)自動(dòng)與下一個(gè)字節(jié)結(jié)合在一起來表示一個(gè)完整的遠(yuǎn)東字符。如果把全角的字符當(dāng)成一個(gè)字符輸出時(shí),通常造成輸出結(jié)果被扭曲,這一點(diǎn)需要注意。3升達(dá)大學(xué)資訊系半角與全角的輸入法區(qū)別半角全角參見下面的例程:4升達(dá)大學(xué)資訊系5升達(dá)大學(xué)資訊系運(yùn)行結(jié)果6升達(dá)大學(xué)資訊系C風(fēng)格的字符串和標(biāo)準(zhǔn)string類型1.字符串可以視為由字符(數(shù)據(jù)類型為char)構(gòu)成的一維數(shù)組,也可以將字符串的首地址給予char指針(又稱之為C風(fēng)格的字符串,C-stylestring)。因此可以有下列兩種聲明字符串的方式:charS1[20]=“hello!”;//數(shù)組式的聲明charS1[]=“hello!”;//數(shù)組式的聲明,省略維數(shù)char*pS2=“hello!”;//指針式的聲明,C風(fēng)格將字符串視為一維char數(shù)組時(shí),可以采用逐一列出各字符的方式設(shè)定字符串的值。譬如:charS3[10]={‘T’,’h’,’e‘,’‘,’b’,’o’,’y’};此處的空格一定為:‘’,如果不慎寫成‘’(沒有空格),將會(huì)造成語法錯(cuò)誤。7升達(dá)大學(xué)資訊系二維字符串?dāng)?shù)組字符串?dāng)?shù)組實(shí)際就是一個(gè)二維字符數(shù)組。例如:charsarr[3][21];//說明了一個(gè)包含五個(gè)字符串,且每個(gè)字符串的最大長度為20的字符串?dāng)?shù)組。與多維數(shù)組一樣,字符串?dāng)?shù)組也允許進(jìn)行初始化,如:charsarr[3][21]={“C++language”,”Clangguage”,”C++isbetterthanC”};圖例如下:C++language\0Clanguage\0C++isbetterthanC\08升達(dá)大學(xué)資訊系9升達(dá)大學(xué)資訊系C風(fēng)格的字符串和標(biāo)準(zhǔn)string類型2.C風(fēng)格字符串不方便的地方是,如果看作為字符組的話,必須事先確定該數(shù)組的大小,通常造成要么數(shù)組太小,不夠容納字符串的字符,要么太大,造成內(nèi)存空間的浪費(fèi)。對(duì)于現(xiàn)代的標(biāo)準(zhǔn)string類型來說,是存在這個(gè)問題,而且使用非常方便。例如:strings1;//標(biāo)準(zhǔn)字符串

s1=“abcde”;使用string必須在頭文件納入string這個(gè)頭文件,這里string可以類似于一個(gè)普通的數(shù)據(jù)類型來使用。標(biāo)準(zhǔn)的string類型雖然好用,而實(shí)際上它是基于類和模板的,我們將在后續(xù)的課程講述到。10升達(dá)大學(xué)資訊系11升達(dá)大學(xué)資訊系運(yùn)行結(jié)果12升達(dá)大學(xué)資訊系以指針的方式定義字符串例如:char*ps2=“hi,你好!”;這個(gè)語句在執(zhí)行的時(shí)候完成了兩項(xiàng)工作:(1)在內(nèi)存單元存入字符串“hello,你好”。(2)將此字符串第一個(gè)字符的地址(即h的地址)存入指針ps2中。如下圖所示:ps2h你好i,\013升達(dá)大學(xué)資訊系以指針的方式定義字符串提示:只有字符串的雙引號(hào)才可以配合字符串指針的初始化使用。例如:char*pS3=“goodluck!”;或是可以分開成兩個(gè)語句:char*pS3;pS3=“goodluck!”;//這里不可以理解為指針pS3的內(nèi)容為字符串“goodluck!”。然而char*pS3={‘b’,’o’,’y’};是錯(cuò)誤的。14升達(dá)大學(xué)資訊系字符串的輸入輸出下表列出字符和字符串的輸入輸出設(shè)相關(guān)函數(shù)。在運(yùn)用它們時(shí),需要在程序的開頭納入頭文件<iostream>:iostream標(biāo)準(zhǔn)函數(shù)或通道功能cout輸出函數(shù)cin輸入函數(shù)cin.getline字符串輸入函數(shù)cin.get字符輸入函數(shù)15升達(dá)大學(xué)資訊系字符串的輸出指令一般而言,cout<<x<<endl;//輸出x的內(nèi)容直接輸出。如果x是指針,則輸出x的內(nèi)容——地址。但是上面的這個(gè)規(guī)則對(duì)于字符串指針串指針不適用(stringpointer)。這是因?yàn)閏out在遇到字符串的指針或字符串的起始地址時(shí),會(huì)自動(dòng)將輸出改為字符串的內(nèi)容,而不是將地址輸出。此外,由于字符串都明顯的‘\0’作為結(jié)尾,因此,只有‘\0’之前的部分會(huì)輸出,其后的部分就忽略不計(jì)。16升達(dá)大學(xué)資訊系字符串輸輸入指令例如:charS1[20]=“Hello,你好!”;char*pS=S1;以下輸出語句均為輸出字符串的內(nèi)容:“Hello,你好!”cout<<pS;cout<<S1;cout<<&S1[0];cout<<&pS[0];如果的確想輸出某個(gè)字符串的地址,需使用特殊的語法:cout<<(void*)S1;cout<<(void*)pS;17升達(dá)大學(xué)資訊系字符串的輸入指令cin可以作為字符或者字符串的標(biāo)準(zhǔn)輸入通道,但其輸入數(shù)據(jù)流在遇到空格或新行符號(hào)‘\n’都會(huì)停止。因此,如果要輸入字符串“hello,你好!”(注意有一個(gè)空格)時(shí),必須分兩次擷取:charS1[20],S2[20];cin>>S1>>S2;為了避免這個(gè)限制,可以使用函數(shù)cin.getline()。它的參數(shù)有三個(gè):cin.getline(字符串名稱,最大字符數(shù),結(jié)束字符);其中“結(jié)束字符”的默認(rèn)值是‘\n’,足以對(duì)付大多數(shù)情況。18升達(dá)大學(xué)資訊系字符串的輸入指令針對(duì)剛才的字符串“hello,你好”而言,只要將語句改稱以下的形式即可完成完整的輸入(包括其中的空格):cin.getline(S1,20);//默認(rèn)結(jié)束字符為‘/n’,輸入字符到S1此外,函數(shù)cin.get()一次只能輸入一個(gè)字符,其使用方式如下:charC1;cin.get(C1);//輸入字符到C1參見如下例程:19升達(dá)大學(xué)資訊系20升達(dá)大學(xué)資訊系運(yùn)行結(jié)果21升達(dá)大學(xué)資訊系常用的字符串處理函數(shù)對(duì)字符串的處理中,固然可以每次只處理一個(gè)字符的觀點(diǎn)來進(jìn)行字符串的各種復(fù)制、銜接、計(jì)算長度、比較等等處理。但是使用C++編譯器所附設(shè)的標(biāo)準(zhǔn)字符串處理函數(shù)庫<cstring>可以處理更簡潔、更有效率。在使用這些標(biāo)準(zhǔn)的字符串進(jìn)行處理時(shí),需要在程序開頭加入如下的頭文件語句:#include<cstring>;22升達(dá)大學(xué)資訊系標(biāo)準(zhǔn)字符串處理函數(shù)列表函數(shù)名功能strlen(字符串)求出不包括‘\0’的字符串長度strcpy(字符串1,字符串2)將字符串2拷貝到字符串1內(nèi)strcat(字符串1,字符串2)將字符串2銜接到字符串1后strcmp(字符串1,字符串2)將字符串1與字符串2比較:如果(字符串1<字符串2)則輸出負(fù)整數(shù)。如果(字符串1>字符串2)則輸出正整數(shù)。如果(字符串1=字符串2)則輸出0。strchr(字符串,字符)尋找字符串中第一個(gè)與指定字符相同處的地址23升達(dá)大學(xué)資訊系關(guān)于字符串函數(shù)的一點(diǎn)提示1.由于strcpy()和strcat()在處理時(shí)不會(huì)先行檢查內(nèi)存空間是否足夠,因此在使用時(shí)要特別小心,避免存儲(chǔ)到?jīng)]有聲明的位置,造成執(zhí)行上的錯(cuò)誤,嚴(yán)重時(shí)可能導(dǎo)致當(dāng)機(jī)。2.此外,strcmp()比較的是兩個(gè)字符串個(gè)字符的內(nèi)碼大小。 參見下面的例程:24升達(dá)大學(xué)資訊系25升達(dá)大學(xué)資訊系運(yùn)行結(jié)果26升達(dá)大學(xué)資訊系字符串與數(shù)字的轉(zhuǎn)換字符串內(nèi)容的數(shù)據(jù)是以ASCII碼存儲(chǔ)的,而數(shù)字則是以二進(jìn)制的方式存儲(chǔ)的,因此“365” 和 365所代表的意義完全不同的。數(shù)字可以進(jìn)行數(shù)學(xué)運(yùn)算,但字符串一般意義上是不能的。如果要將字符串與數(shù)字相互轉(zhuǎn)換,可以使用C++編譯器所附設(shè)的標(biāo)準(zhǔn)字符串轉(zhuǎn)換函數(shù)庫。在使用這些字符串與數(shù)字轉(zhuǎn)換的函數(shù)時(shí),要納入頭文件:#include<cstdlib>27升達(dá)大學(xué)資訊系標(biāo)準(zhǔn)字符串轉(zhuǎn)換函數(shù)函數(shù)名稱功能atoi(字符串)將字符串轉(zhuǎn)換成整數(shù),遇到非數(shù)字字符時(shí),停止轉(zhuǎn)換。atof(字符串)將字符串轉(zhuǎn)成double數(shù)字,遇到非數(shù)字或小數(shù)點(diǎn)字符時(shí),停止轉(zhuǎn)換。itoa(整數(shù),字符串,基底)將整數(shù)轉(zhuǎn)成以基底為進(jìn)位的ASCII字符串。例如以10表示十進(jìn)制。28升達(dá)大學(xué)資訊系29升達(dá)大學(xué)資訊系運(yùn)行結(jié)果30升達(dá)大學(xué)資訊系字符的檢查與大小寫轉(zhuǎn)換有時(shí)為了將某份文件中的文字進(jìn)行特殊的轉(zhuǎn)換和編排工作,比如:進(jìn)行大小寫的轉(zhuǎn)換將數(shù)據(jù)中的點(diǎn)號(hào)“,”除掉將所有文字對(duì)齊將所有的非數(shù)字符號(hào)除掉將所有的段落符號(hào)除掉等等這些工作都需要逐一進(jìn)行字符的檢查或者轉(zhuǎn)換。這類功能可以調(diào)用C++的標(biāo)準(zhǔn)字符函數(shù)庫<cctype>:#include<cctype>31升達(dá)大學(xué)資訊系函數(shù)功能(假設(shè)ch為char數(shù)據(jù))isalpha(ch)判斷ch是否為英文字母isupper(ch)判斷ch是否為大寫英文字母islower(ch)判斷ch是否為小寫英文字母isdigit(ch)判斷ch是否為0-9的數(shù)字字符isascii(ch)判斷ch是否為ASCII碼isspace(ch)判斷ch是否為空格isprint(ch)判斷ch是否為可以打印的字符或看得見的字符iscntrl(ch)判斷ch是否為控制字符ispucnt(ch)判斷ch是否為標(biāo)點(diǎn)符號(hào)字符toupper(ch)如果ch為小寫則轉(zhuǎn)換為大寫tolower(ch)如果ch為大寫則轉(zhuǎn)換為小寫32升達(dá)大學(xué)資訊系33升達(dá)大學(xué)資訊系運(yùn)行結(jié)果34升達(dá)大學(xué)資訊系字符串的指針數(shù)組如果把具有相同特征的一群字符串以指針數(shù)組來代表,常??梢宰屪址奶幚砀臃奖恪H缦铝谐绦颍?5升達(dá)大學(xué)資訊系VC運(yùn)行結(jié)果36升達(dá)大學(xué)資訊系BCC運(yùn)行結(jié)果37升達(dá)大學(xué)資訊系Dec-C++運(yùn)行結(jié)果38升達(dá)大學(xué)資訊系為什么沒有用static39升達(dá)大學(xué)資訊系運(yùn)行結(jié)果40升達(dá)大學(xué)資訊系對(duì)字符串指針的一點(diǎn)思考1.char*Strs1[]={"Just","a","test"};Strs1[0][0]=65;//這里編譯沒有錯(cuò)誤,而運(yùn)行時(shí)報(bào)錯(cuò),為什么?

cout<<Strs1[0];41升達(dá)大學(xué)資訊系錯(cuò)誤對(duì)話框42升達(dá)大學(xué)資訊系對(duì)字符串指針的一點(diǎn)思考2.char**Strs2=newchar*[3];Strs2[0]=newchar[5];strcpy(Strs2[0],"Just");Strs2[1]=newchar[2];strcpy(Strs2[1],"a");Strs2[2]=newchar[5];strcpy(Strs2[2],"test");Strs2[0][0]=65;//完全正常,為什么?

cout<<Strs2[0];//輸出為:43升達(dá)大學(xué)資訊系答案小提示:第一個(gè)方法實(shí)際得到的是constchar*,也就是說,它定義了一個(gè)常量的指針,編譯器把它放在只讀存儲(chǔ)區(qū)(read-onlyarea),其指向的內(nèi)容不可更改。而第二方法是放在動(dòng)態(tài)分配的堆區(qū)(heap),可讀可寫。自然就可以改變其內(nèi)容了。44升達(dá)大學(xué)資訊系補(bǔ)充小知識(shí):堆和棧的區(qū)別一般認(rèn)為在C/C++中分為這幾個(gè)存儲(chǔ)區(qū)1棧-有編譯器自動(dòng)分配釋放2堆-一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時(shí)可能由OS回收3全局區(qū)(靜態(tài)區(qū)),全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。

-程序結(jié)束釋放4另外還有一個(gè)專門放常量的地方。-程序結(jié)束釋放45升達(dá)大學(xué)資訊系堆和棧的區(qū)別在函數(shù)體中定義的變量通常是在棧上,用malloc,calloc,realloc(C++中為new)等分配內(nèi)存的函數(shù)分配得到的就是在堆上。在所有函數(shù)體外定義的是全局量,加了static修飾符后不管在哪里都存放在全局區(qū)(靜態(tài)區(qū)),在所有函數(shù)體外定義的static變量表示在該文件中有效(這時(shí)和未命名的名稱空間效果是一樣的),不能extern到別的文件用,在函數(shù)體內(nèi)定義的static表示只在該函數(shù)體內(nèi)有效。另外函數(shù)中的“adgfdf”這樣的字符串存放在常量區(qū)(這一點(diǎn)非常重要)。46升達(dá)大學(xué)資訊系堆和棧的區(qū)別比如:inta=0;//全局初始化區(qū)char*p1;//全局未初始化區(qū)main(){int

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論