語言程序設計(7)_第1頁
語言程序設計(7)_第2頁
語言程序設計(7)_第3頁
語言程序設計(7)_第4頁
語言程序設計(7)_第5頁
已閱讀5頁,還剩29頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、C+語言程序設計Lecture 71第7章 字符串:分析文本計算機上的文本存儲獲取字符串字符串處理函數(shù)讀取字符串輸入字符與字符串新的C+ string 類一些例子27.1 計算機上的本文存儲 任何數(shù)據(jù)在計算機中都是以二進制方式存儲的插曲:數(shù)制文本也不例外,以ASCII碼的方式轉(zhuǎn)換為數(shù)值例如:char *str=“Hello!”;在內(nèi)存中的形式為:何時會發(fā)生字符與數(shù)值的轉(zhuǎn)換?輸入字符時顯示字符時37.2 獲取正確的字符串字符串的本質(zhì)是一個字符數(shù)組而字符類型(char)也可以理解為一個取值范圍為0255的整型(int)可以以多種方式來聲明字符串輸出的情況 輸出時,字符數(shù)組名或指針不會輸出地址值,而

2、是輸出字符串特別的,賦值str7=m;后牢記:字符串的結(jié)束標志為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ù)時要特別注意應有足夠的內(nèi)存空間存儲字符串在內(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)建字符串功能:從用戶輸入獲取字符串,然后以這些字符串為基礎,構(gòu)建一個大的字符串如何輸入一行字符串呢?可以用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輸入一個整數(shù)時,在系統(tǒng)中會進行字符串到整數(shù)的類型轉(zhuǎn)換cin也可以用于輸入字符串,但前面已經(jīng)說過,這樣無法將空格輸入,因此改用cin.getline()“.”的含義使用cin還有另外的問題任何未使用的輸入都會留待下次執(zhí)行時使用,這有時會帶來意外的錯誤。無法使用輸入默認值如果用戶直接按回車,不輸入任何東西,那么計算機會一直等下去讓我們通過實例來觀察一下97.6

6、示例:獲取數(shù)字作用:用戶輸入數(shù)值時,輸出它的平方根,如果用戶沒有輸入直接按回車,則默認值為0.0,用戶主動輸入0時程序終止double get_number() char s100; cin.getline(s,99); if(strlen=0) return 0.0; return atof(s);atof的作用是將字符串轉(zhuǎn)為浮點數(shù) 相應地,atoi是將字符串轉(zhuǎn)為整數(shù)程序有問題嗎? 驗證一下 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練習:P133 7.3.2重寫轉(zhuǎn)換成大寫的程序,讓它直接使用指針引用,而不是使用數(shù)組引用,如果抵達字符串末尾,那么當前字符為null終止符,即可以用*p=0來判斷,也可以使用*p本身來判斷12補充的練習:統(tǒng)計一行字符串中各字符出現(xiàn)的次數(shù),輸出各字符及個數(shù)13討論需要用到的數(shù)據(jù)結(jié)構(gòu)用一個字符數(shù)組(或字符指針)來保存用戶輸入的字符串char str100;用什么樣的數(shù)據(jù)結(jié)構(gòu)來記錄每個字符的出現(xiàn)次數(shù)呢?還記得海盜跳海的例子嗎?在那里我們用ai=1表示第i

8、個海盜跳海那么在這里,很自然地用counta=5的方式來表示字符a出現(xiàn)了5次,當然,我們或許需要一種“映射”字符到數(shù)組下標之間的映射我們需要嗎?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上機練習稍復雜一些的情況:統(tǒng)計一行字符串中單詞的數(shù)目(單詞之間的分

9、隔可以是空格或除數(shù)字和字母外的其它標點符號)167.8 字符與字符串的比較在C+中,字符常量用單引號括起A字符串常量則用雙引號(哪怕是一個字符的字符串),如”A”A只占一個字節(jié),而“A”則占兩個字節(jié)(為什么?)在正確的位置使用正確的表述char s = “A”;if(s0=A) cout“The first letter of the string isA.”;177.9 分析輸入獲取整行輸入,然后分析它的內(nèi)容以逗號作為分隔符將每個字符串片段存儲在數(shù)組當中使用strtok函數(shù)可以直接完成類似功能,但仍然有必要寫自定義函數(shù)完成它18思路將用戶的輸入放入一個字符串中,然后遍歷這個字符串,遇到分隔符

10、,就把前面的一段內(nèi)容放入一個字符串數(shù)組中,重復這個過程直到用戶輸入的字符串結(jié)束(即遍歷到結(jié)束標志0),然后輸出這個字符串數(shù)組19主要數(shù)據(jù)結(jié)構(gòu) 用以存放用戶輸入的字符數(shù)組char buffer200思考:這里可以用字符指針而不用字符數(shù)組嗎?為什么?用以存放各片段的字符串數(shù)組char strs10100使用二維數(shù)組char 和使用char *有什么不同呢?不清楚嗎?那就暫時不理會它一個自定義函數(shù)int get_a_string(char * buffer,char * dest,int pos)將buffer字符串中從pos開始的第一個字符串片段(即從pos開始到第一次遇到分隔字符為止的內(nèi)容)放入

11、dest中,并返回第一個未讀字符的位置20get_a_string函數(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)境中運行一下22討論為什么運行得不對呢?當我們想了解程序運行狀況的時候,最好的方法就是用一個實例去“逐行”地運行這個程序以用戶輸入”me,myself,and,i”為例找到問題所在了嗎?如果將char buffer200換成 char * buffer會怎樣?為什么?如果將char strs10100換成char * strs10會怎樣?為什么?237.10 新的C+ string類string是一個“類”,還是一個“類型”?應該說,是“類類型”#include 表示添加了對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;/輸入一個單詞(到空格為止)使用getlinestring name;getline(cin,name);/輸入整行,注意與前面

14、看到 /的getline的不同還記得嗎?cin.getline(add,199);在string的getline中,不用輸入最大字符數(shù),其容量會自動調(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 對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將一系列單詞存放在程序中,然后隨機選出一個單詞,讓用戶猜測該單詞中的字母,如果玩家猜了6次還沒猜出來所有字母,就算輸了。31需要用到哪些數(shù)據(jù)結(jié)構(gòu)?一個字符串數(shù)組string wordlistNUM 一個記錄次數(shù)的變量guesses 一個字符串a(chǎn)ttempt ,它的長度與被猜的單詞相同,但字符顯示為_,當用戶猜中一個字符中,將相應的_替換掉3

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論