




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、C+語言程序設(shè)計(jì)Lecture 71第7章 字符串:分析文本計(jì)算機(jī)上的文本存儲(chǔ)獲取字符串字符串處理函數(shù)讀取字符串輸入字符與字符串新的C+ string 類一些例子27.1 計(jì)算機(jī)上的本文存儲(chǔ) 任何數(shù)據(jù)在計(jì)算機(jī)中都是以二進(jìn)制方式存儲(chǔ)的插曲:數(shù)制文本也不例外,以ASCII碼的方式轉(zhuǎn)換為數(shù)值例如:char *str=“Hello!”;在內(nèi)存中的形式為:何時(shí)會(huì)發(fā)生字符與數(shù)值的轉(zhuǎn)換?輸入字符時(shí)顯示字符時(shí)37.2 獲取正確的字符串字符串的本質(zhì)是一個(gè)字符數(shù)組而字符類型(char)也可以理解為一個(gè)取值范圍為0255的整型(int)可以以多種方式來聲明字符串輸出的情況 輸出時(shí),字符數(shù)組名或指針不會(huì)輸出地址值,而
2、是輸出字符串特別的,賦值str7=m;后牢記:字符串的結(jié)束標(biāo)志為0char str10;str0=H;str1=e;str2=l;str3=l;str4=o;str5=!;str6=0;Str7=m;char str10=“Hello!”;char str=“Hello!”;char *p=“Hello!”;47.3 字符串處理函數(shù)我們已經(jīng)使用過一些C+的庫函數(shù)如sqrt,rand等常用的字符串函數(shù):strcpy(s1,s2),strcat(s1,s2),strlen(s), strncpy(s1,s2,n),strncat(s1,s2,n),strcmp(s1,s2),strncmp(s1,
3、s2,n)char s80;strcpy(s,”O(jiān)ne”);strcat(s,”Two”);strcat(s,”Three”);couts;注意:在使用字符串函數(shù)時(shí)要特別注意應(yīng)有足夠的內(nèi)存空間存儲(chǔ)字符串在內(nèi)存中發(fā)生了什么?5這樣的程序有問題嗎?void main()char s1=”just”;char s2=“ a test”; strcpy(s1,s2); strcat(s1,s2); couts1“ “s2;67.4 示例:構(gòu)建字符串功能:從用戶輸入獲取字符串,然后以這些字符串為基礎(chǔ),構(gòu)建一個(gè)大的字符串如何輸入一行字符串呢?可以用cin嗎?讓我們來試試輸入整行的方法:cin.getlin
4、e(str,len);將小字符串拼接起來的函數(shù)strcat(s1,s2);7完整的程序#include #includeusing namespace std;int main() char str600; char name100; char addr200; char work200; cout“Enter.”; cin.getline(name,99); cout“Enter.”; cin.getline(addr,199); cout“Enter.”; cin.getline(work,199); strcpy(str,”nMy name is “); strcat(str,name)
5、; strcat(str,”, I live at ”); strcat(str,addr); strcat(str,”nand I work at “); strcat(str,work); strcat(str,”.”); cout n輸入一個(gè)整數(shù)時(shí),在系統(tǒng)中會(huì)進(jìn)行字符串到整數(shù)的類型轉(zhuǎn)換cin也可以用于輸入字符串,但前面已經(jīng)說過,這樣無法將空格輸入,因此改用cin.getline()“.”的含義使用cin還有另外的問題任何未使用的輸入都會(huì)留待下次執(zhí)行時(shí)使用,這有時(shí)會(huì)帶來意外的錯(cuò)誤。無法使用輸入默認(rèn)值如果用戶直接按回車,不輸入任何東西,那么計(jì)算機(jī)會(huì)一直等下去讓我們通過實(shí)例來觀察一下97.6
6、示例:獲取數(shù)字作用:用戶輸入數(shù)值時(shí),輸出它的平方根,如果用戶沒有輸入直接按回車,則默認(rèn)值為0.0,用戶主動(dòng)輸入0時(shí)程序終止double get_number() char s100; cin.getline(s,99); if(strlen=0) return 0.0; return atof(s);atof的作用是將字符串轉(zhuǎn)為浮點(diǎn)數(shù) 相應(yīng)地,atoi是將字符串轉(zhuǎn)為整數(shù)程序有問題嗎? 驗(yàn)證一下 107.7 轉(zhuǎn)換成大寫功能:將用戶輸入的字符串轉(zhuǎn)換為全部大寫void convert_to_upper(char* s) int i; int length=strlen(s); for(i=0;ile
7、ngth;i+) si=toupper(si);不使用toupper函數(shù)可以嗎?如何自己書寫程序完成小寫到大寫的轉(zhuǎn)換?請觀察附錄中的ASCII表11練習(xí):P133 7.3.2重寫轉(zhuǎn)換成大寫的程序,讓它直接使用指針引用,而不是使用數(shù)組引用,如果抵達(dá)字符串末尾,那么當(dāng)前字符為null終止符,即可以用*p=0來判斷,也可以使用*p本身來判斷12補(bǔ)充的練習(xí):統(tǒng)計(jì)一行字符串中各字符出現(xiàn)的次數(shù),輸出各字符及個(gè)數(shù)13討論需要用到的數(shù)據(jù)結(jié)構(gòu)用一個(gè)字符數(shù)組(或字符指針)來保存用戶輸入的字符串char str100;用什么樣的數(shù)據(jù)結(jié)構(gòu)來記錄每個(gè)字符的出現(xiàn)次數(shù)呢?還記得海盜跳海的例子嗎?在那里我們用ai=1表示第i
8、個(gè)海盜跳海那么在這里,很自然地用counta=5的方式來表示字符a出現(xiàn)了5次,當(dāng)然,我們或許需要一種“映射”字符到數(shù)組下標(biāo)之間的映射我們需要嗎?14可以來完成程序了嗎?int main() char str100; int count128=0; int i=0; cout“Enter”; cin.getline(str,99); char c=str0; while(c!=0) i+; countc+; c=stri; for(int j=0;j0) cout(char)j“:”countjendl; return 0; 15上機(jī)練習(xí)稍復(fù)雜一些的情況:統(tǒng)計(jì)一行字符串中單詞的數(shù)目(單詞之間的分
9、隔可以是空格或除數(shù)字和字母外的其它標(biāo)點(diǎn)符號(hào))167.8 字符與字符串的比較在C+中,字符常量用單引號(hào)括起A字符串常量則用雙引號(hào)(哪怕是一個(gè)字符的字符串),如”A”A只占一個(gè)字節(jié),而“A”則占兩個(gè)字節(jié)(為什么?)在正確的位置使用正確的表述char s = “A”;if(s0=A) cout“The first letter of the string isA.”;177.9 分析輸入獲取整行輸入,然后分析它的內(nèi)容以逗號(hào)作為分隔符將每個(gè)字符串片段存儲(chǔ)在數(shù)組當(dāng)中使用strtok函數(shù)可以直接完成類似功能,但仍然有必要寫自定義函數(shù)完成它18思路將用戶的輸入放入一個(gè)字符串中,然后遍歷這個(gè)字符串,遇到分隔符
10、,就把前面的一段內(nèi)容放入一個(gè)字符串?dāng)?shù)組中,重復(fù)這個(gè)過程直到用戶輸入的字符串結(jié)束(即遍歷到結(jié)束標(biāo)志0),然后輸出這個(gè)字符串?dāng)?shù)組19主要數(shù)據(jù)結(jié)構(gòu) 用以存放用戶輸入的字符數(shù)組char buffer200思考:這里可以用字符指針而不用字符數(shù)組嗎?為什么?用以存放各片段的字符串?dāng)?shù)組char strs10100使用二維數(shù)組char 和使用char *有什么不同呢?不清楚嗎?那就暫時(shí)不理會(huì)它一個(gè)自定義函數(shù)int get_a_string(char * buffer,char * dest,int pos)將buffer字符串中從pos開始的第一個(gè)字符串片段(即從pos開始到第一次遇到分隔字符為止的內(nèi)容)放入
11、dest中,并返回第一個(gè)未讀字符的位置20get_a_string函數(shù)的實(shí)現(xiàn)int get_a_string(char * buffer,char * dest,int pos) int i=pos;int j=0; if(bufferi=0) return -1; while(bufferi!=, & bufferi!=0) destj=bufferi; i+;j+; destj=0; return i;21在主函數(shù)中使用get_a_stringint pos =0;int i=0;while(i10) pos=get_a_string(buffer,strsi,pos); if (pos=
12、-1) break; i+;讓我們在開發(fā)環(huán)境中運(yùn)行一下22討論為什么運(yùn)行得不對(duì)呢?當(dāng)我們想了解程序運(yùn)行狀況的時(shí)候,最好的方法就是用一個(gè)實(shí)例去“逐行”地運(yùn)行這個(gè)程序以用戶輸入”me,myself,and,i”為例找到問題所在了嗎?如果將char buffer200換成 char * buffer會(huì)怎樣?為什么?如果將char strs10100換成char * strs10會(huì)怎樣?為什么?237.10 新的C+ string類string是一個(gè)“類”,還是一個(gè)“類型”?應(yīng)該說,是“類類型”#include 表示添加了對(duì)string類的支持,而#include 則表示支持舊的字符串函數(shù),如strc
13、mp等 string類也在命名空間std中24聲明和初始化string類型的變量聲明string a,b,c;初始化 string a(“Here is a string.”); 賦值a=“Here is a string”;25string 類型變量的處理在string類型的變量處理中,不需要為了拷貝內(nèi)容或比較而使用函數(shù)string cat(“Persian”);string dog(“Dane”);dog = cat;if(cat = dog) coutname;/輸入一個(gè)單詞(到空格為止)使用getlinestring name;getline(cin,name);/輸入整行,注意與前面
14、看到 /的getline的不同還記得嗎?cin.getline(add,199);在string的getline中,不用輸入最大字符數(shù),其容量會(huì)自動(dòng)調(diào)整277.11 使用string來構(gòu)建字符串#include #include using namespace std;int main() string str,name,addr,work; cout“.”; getline(cin,name); cout“.”; getline(cin,addr); cout“.”; getline(cin,work); str=“My name is ”+name+”,”+”I live at”+addr
15、+”,nand I work at”+work+”.n”; coutstr; return 0;287.12 對(duì)string 類型的其他操作訪問字符串中的字符string dog=“Dane”;cout dog0;/D獲取長度string dog=“Dane”;cout dog.size();/4其他的函數(shù)assign,empty,find,insert,replace,swapP14429The time for gameHangman :a word game30Hangman將一系列單詞存放在程序中,然后隨機(jī)選出一個(gè)單詞,讓用戶猜測該單詞中的字母,如果玩家猜了6次還沒猜出來所有字母,就算輸了。31需要用到哪些數(shù)據(jù)結(jié)構(gòu)?一個(gè)字符串?dāng)?shù)組string wordlistNUM 一個(gè)記錄次數(shù)的變量guesses 一個(gè)字符串a(chǎn)ttempt ,它的長度與被猜的單詞相同,但字符顯示為_,當(dāng)用戶猜中一個(gè)字符中,將相應(yīng)的_替換掉3
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 復(fù)發(fā)性流產(chǎn)護(hù)理
- 2025年內(nèi)燃機(jī)電點(diǎn)火起動(dòng)裝置相關(guān)電工器材項(xiàng)目合作計(jì)劃書
- 2025年微波器件及電路項(xiàng)目發(fā)展計(jì)劃
- 健康飲食產(chǎn)業(yè)園項(xiàng)目投資計(jì)劃書(范文參考)
- 2025年超高速加工中心項(xiàng)目合作計(jì)劃書
- xx河流排水防澇設(shè)施建設(shè)項(xiàng)目商業(yè)計(jì)劃書(范文模板)
- 五年級(jí)小學(xué)健康教育課教案
- 2025年年人臉識(shí)別合作協(xié)議書
- 污水處理工程施工方案
- 常用中藥的分類
- 《成人糖尿病患者的高血糖危象:共識(shí)報(bào)告》-學(xué)習(xí)與應(yīng)用
- 鍍鋅板知識(shí)課件
- 2025-2030偏光成像相機(jī)行業(yè)市場現(xiàn)狀供需分析及重點(diǎn)企業(yè)投資評(píng)估規(guī)劃分析研究報(bào)告
- 腦卒中急救培訓(xùn)課件
- 豬場退股協(xié)議書范本
- 2025海南保亭農(nóng)水投資有限公司招聘22人筆試參考題庫附帶答案詳解
- 靜密封管理制度
- AI人工智能在金融領(lǐng)域的應(yīng)用案例
- 2024-2025學(xué)年人教版初中地理七年級(jí)下冊課件 第7章 第2節(jié) 人文環(huán)境
- 2025年遼寧輕工職業(yè)學(xué)院高職單招職業(yè)技能考試題庫附答案解析
- 2024年第二次廣東省普通高中化學(xué)學(xué)業(yè)水平合格性考試真題卷含答案
評(píng)論
0/150
提交評(píng)論