版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第8講字符串C++課件1字符串的概念字符串(string)是由雙引號“”所包括起來的一串文字。字符串在內(nèi)存中的儲存方式很特別,除了我們看到的文字外,其后還多加一個‘\0’字符,亦即空字符(NULLcharacter)。它的ASCII值為0,作為字符串的結(jié)束標(biāo)記。特別需要注意的是:英文字母,空格和標(biāo)定符號都在1個字節(jié),而每個中文占據(jù)2個字節(jié)。而對于英文字母,空格和標(biāo)定符號有兩種寫法,占1個字節(jié)的稱為ASCII碼,占兩個字節(jié)的稱為全角碼。2升達(dá)大學(xué)資訊系字符串的概念全角碼實際是緣于微軟公司在遠(yuǎn)東地區(qū)的Windows本版,它使用DBCS碼(雙字節(jié)字符集,Double-ByteCharacterSet)用來支持遠(yuǎn)東地區(qū)許多象形文字的表達(dá),如中文,日文,韓文等。在這種字符集中大于128的ASCII碼字符作為前導(dǎo)字符(而這部分字符通常不顯示),并不代表實際意義,而是會自動與下一個字節(jié)結(jié)合在一起來表示一個完整的遠(yuǎn)東字符。如果把全角的字符當(dāng)成一個字符輸出時,通常造成輸出結(jié)果被扭曲,這一點需要注意。3升達(dá)大學(xué)資訊系半角與全角的輸入法區(qū)別半角全角參見下面的例程:4升達(dá)大學(xué)資訊系5升達(dá)大學(xué)資訊系運行結(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è)定字符串的值。譬如:charS3[10]={‘T’,’h’,’e‘,’‘,’b’,’o’,’y’};此處的空格一定為:‘’,如果不慎寫成‘’(沒有空格),將會造成語法錯誤。7升達(dá)大學(xué)資訊系二維字符串?dāng)?shù)組字符串?dāng)?shù)組實際就是一個二維字符數(shù)組。例如:charsarr[3][21];//說明了一個包含五個字符串,且每個字符串的最大長度為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)存空間的浪費。對于現(xiàn)代的標(biāo)準(zhǔn)string類型來說,是存在這個問題,而且使用非常方便。例如:strings1;//標(biāo)準(zhǔn)字符串
s1=“abcde”;使用string必須在頭文件納入string這個頭文件,這里string可以類似于一個普通的數(shù)據(jù)類型來使用。標(biāo)準(zhǔn)的string類型雖然好用,而實際上它是基于類和模板的,我們將在后續(xù)的課程講述到。10升達(dá)大學(xué)資訊系11升達(dá)大學(xué)資訊系運行結(jié)果12升達(dá)大學(xué)資訊系以指針的方式定義字符串例如:char*ps2=“hi,你好!”;這個語句在執(zhí)行的時候完成了兩項工作:(1)在內(nèi)存單元存入字符串“hello,你好”。(2)將此字符串第一個字符的地址(即h的地址)存入指針ps2中。如下圖所示:ps2h你好i,\013升達(dá)大學(xué)資訊系以指針的方式定義字符串提示:只有字符串的雙引號才可以配合字符串指針的初始化使用。例如:char*pS3=“goodluck!”;或是可以分開成兩個語句:char*pS3;pS3=“goodluck!”;//這里不可以理解為指針pS3的內(nèi)容為字符串“goodluck!”。然而char*pS3={‘b’,’o’,’y’};是錯誤的。14升達(dá)大學(xué)資訊系字符串的輸入輸出下表列出字符和字符串的輸入輸出設(shè)相關(guā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)容——地址。但是上面的這個規(guī)則對于字符串指針串指針不適用(stringpointer)。這是因為cout在遇到字符串的指針或字符串的起始地址時,會自動將輸出改為字符串的內(nèi)容,而不是將地址輸出。此外,由于字符串都明顯的‘\0’作為結(jié)尾,因此,只有‘\0’之前的部分會輸出,其后的部分就忽略不計。16升達(dá)大學(xué)資訊系字符串輸輸入指令例如:charS1[20]=“Hello,你好!”;char*pS=S1;以下輸出語句均為輸出字符串的內(nèi)容:“Hello,你好!”cout<<pS;cout<<S1;cout<<&S1[0];cout<<&pS[0];如果的確想輸出某個字符串的地址,需使用特殊的語法:cout<<(void*)S1;cout<<(void*)pS;17升達(dá)大學(xué)資訊系字符串的輸入指令cin可以作為字符或者字符串的標(biāo)準(zhǔn)輸入通道,但其輸入數(shù)據(jù)流在遇到空格或新行符號‘\n’都會停止。因此,如果要輸入字符串“hello,你好!”(注意有一個空格)時,必須分兩次擷?。篶harS1[20],S2[20];cin>>S1>>S2;為了避免這個限制,可以使用函數(shù)cin.getline()。它的參數(shù)有三個:cin.getline(字符串名稱,最大字符數(shù),結(jié)束字符);其中“結(jié)束字符”的默認(rèn)值是‘\n’,足以對付大多數(shù)情況。18升達(dá)大學(xué)資訊系字符串的輸入指令針對剛才的字符串“hello,你好”而言,只要將語句改稱以下的形式即可完成完整的輸入(包括其中的空格):cin.getline(S1,20);//默認(rèn)結(jié)束字符為‘/n’,輸入字符到S1此外,函數(shù)cin.get()一次只能輸入一個字符,其使用方式如下:charC1;cin.get(C1);//輸入字符到C1參見如下例程:19升達(dá)大學(xué)資訊系20升達(dá)大學(xué)資訊系運行結(jié)果21升達(dá)大學(xué)資訊系常用的字符串處理函數(shù)對字符串的處理中,固然可以每次只處理一個字符的觀點來進(jìn)行字符串的各種復(fù)制、銜接、計算長度、比較等等處理。但是使用C++編譯器所附設(shè)的標(biāo)準(zhǔn)字符串處理函數(shù)庫<cstring>可以處理更簡潔、更有效率。在使用這些標(biāo)準(zhǔn)的字符串進(jìn)行處理時,需要在程序開頭加入如下的頭文件語句:#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(字符串,字符)尋找字符串中第一個與指定字符相同處的地址23升達(dá)大學(xué)資訊系關(guān)于字符串函數(shù)的一點提示1.由于strcpy()和strcat()在處理時不會先行檢查內(nèi)存空間是否足夠,因此在使用時要特別小心,避免存儲到?jīng)]有聲明的位置,造成執(zhí)行上的錯誤,嚴(yán)重時可能導(dǎo)致當(dāng)機(jī)。2.此外,strcmp()比較的是兩個字符串個字符的內(nèi)碼大小。 參見下面的例程:24升達(dá)大學(xué)資訊系25升達(dá)大學(xué)資訊系運行結(jié)果26升達(dá)大學(xué)資訊系字符串與數(shù)字的轉(zhuǎn)換字符串內(nèi)容的數(shù)據(jù)是以ASCII碼存儲的,而數(shù)字則是以二進(jìn)制的方式存儲的,因此“365” 和 365所代表的意義完全不同的。數(shù)字可以進(jìn)行數(shù)學(xué)運算,但字符串一般意義上是不能的。如果要將字符串與數(shù)字相互轉(zhuǎn)換,可以使用C++編譯器所附設(shè)的標(biāo)準(zhǔn)字符串轉(zhuǎn)換函數(shù)庫。在使用這些字符串與數(shù)字轉(zhuǎn)換的函數(shù)時,要納入頭文件:#include<cstdlib>27升達(dá)大學(xué)資訊系標(biāo)準(zhǔn)字符串轉(zhuǎn)換函數(shù)函數(shù)名稱功能atoi(字符串)將字符串轉(zhuǎn)換成整數(shù),遇到非數(shù)字字符時,停止轉(zhuǎn)換。atof(字符串)將字符串轉(zhuǎn)成double數(shù)字,遇到非數(shù)字或小數(shù)點字符時,停止轉(zhuǎn)換。itoa(整數(shù),字符串,基底)將整數(shù)轉(zhuǎn)成以基底為進(jìn)位的ASCII字符串。例如以10表示十進(jìn)制。28升達(dá)大學(xué)資訊系29升達(dá)大學(xué)資訊系運行結(jié)果30升達(dá)大學(xué)資訊系字符的檢查與大小寫轉(zhuǎn)換有時為了將某份文件中的文字進(jìn)行特殊的轉(zhuǎn)換和編排工作,比如:進(jìn)行大小寫的轉(zhuǎn)換將數(shù)據(jù)中的點號“,”除掉將所有文字對齊將所有的非數(shù)字符號除掉將所有的段落符號除掉等等這些工作都需要逐一進(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)點符號字符toupper(ch)如果ch為小寫則轉(zhuǎn)換為大寫tolower(ch)如果ch為大寫則轉(zhuǎn)換為小寫32升達(dá)大學(xué)資訊系33升達(dá)大學(xué)資訊系運行結(jié)果34升達(dá)大學(xué)資訊系字符串的指針數(shù)組如果把具有相同特征的一群字符串以指針數(shù)組來代表,常常可以讓字符串的處理更加方便。如下列程序:35升達(dá)大學(xué)資訊系VC運行結(jié)果36升達(dá)大學(xué)資訊系BCC運行結(jié)果37升達(dá)大學(xué)資訊系Dec-C++運行結(jié)果38升達(dá)大學(xué)資訊系為什么沒有用static39升達(dá)大學(xué)資訊系運行結(jié)果40升達(dá)大學(xué)資訊系對字符串指針的一點思考1.char*Strs1[]={"Just","a","test"};Strs1[0][0]=65;//這里編譯沒有錯誤,而運行時報錯,為什么?
cout<<Strs1[0];41升達(dá)大學(xué)資訊系錯誤對話框42升達(dá)大學(xué)資訊系對字符串指針的一點思考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é)資訊系答案小提示:第一個方法實際得到的是constchar*,也就是說,它定義了一個常量的指針,編譯器把它放在只讀存儲區(qū)(read-onlyarea),其指向的內(nèi)容不可更改。而第二方法是放在動態(tài)分配的堆區(qū)(heap),可讀可寫。自然就可以改變其內(nèi)容了。44升達(dá)大學(xué)資訊系補(bǔ)充小知識:堆和棧的區(qū)別一般認(rèn)為在C/C++中分為這幾個存儲區(qū)1棧-有編譯器自動分配釋放2堆-一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時可能由OS回收3全局區(qū)(靜態(tài)區(qū)),全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。
-程序結(jié)束釋放4另外還有一個專門放常量的地方。-程序結(jié)束釋放45升達(dá)大學(xué)資訊系堆和棧的區(qū)別在函數(shù)體中定義的變量通常是在棧上,用malloc,calloc,realloc(C++中為new)等分配內(nèi)存的函數(shù)分配得到的就是在堆上。在所有函數(shù)體外定義的是全局量,加了static修飾符后不管在哪里都存放在全局區(qū)(靜態(tài)區(qū)),在所有函數(shù)體外定義的static變量表示在該文件中有效(這時和未命名的名稱空間效果是一樣的),不能extern到別的文件用,在函數(shù)體內(nèi)定義的static表示只在該函數(shù)體內(nèi)有效。另外函數(shù)中的“adgfdf”這樣的字符串存放在常量區(qū)(這一點非常重要)。46升達(dá)大學(xué)資訊系堆和棧的區(qū)別比如:inta=0;//全局初始化區(qū)char*p1;//全局未初始化區(qū)main(){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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年通信設(shè)備采購與維護(hù)合同2篇
- 電梯安裝工程2025年度技術(shù)咨詢合同6篇
- 二零二五年度論壇活動策劃服務(wù)合同模板6篇
- 二零二五版搬家服務(wù)及家居清潔維護(hù)合同3篇
- 二零二五年度廢鋼市場供應(yīng)與環(huán)保處理服務(wù)合同3篇
- 二零二五版房屋買賣及鄰里關(guān)系協(xié)調(diào)服務(wù)合同3篇
- 二零二五年度股東干股合作企業(yè)社會責(zé)任履行合同3篇
- 幼兒園2025年度食品供應(yīng)合同2篇
- 二零二五版租賃房屋改造裝修合同3篇
- 二零二五年酒店股權(quán)分割與資產(chǎn)重組咨詢合同3篇
- 2023社會責(zé)任報告培訓(xùn)講稿
- 2023核電廠常規(guī)島及輔助配套設(shè)施建設(shè)施工技術(shù)規(guī)范 第8部分 保溫及油漆
- 2025年蛇年春聯(lián)帶橫批-蛇年對聯(lián)大全新春對聯(lián)集錦
- 表B. 0 .11工程款支付報審表
- 警務(wù)航空無人機(jī)考試題庫及答案
- 空氣自動站儀器運營維護(hù)項目操作說明以及簡單故障處理
- 新生兒窒息復(fù)蘇正壓通氣課件
- 法律顧問投標(biāo)書
- 班主任培訓(xùn)簡報4篇(一)
- 成都市數(shù)學(xué)八年級上冊期末試卷含答案
- T-CHSA 020-2023 上頜骨缺損手術(shù)功能修復(fù)重建的專家共識
評論
0/150
提交評論