C語(yǔ)言新教材PPT課堂課件-第十二節(jié)字符串_第1頁(yè)
C語(yǔ)言新教材PPT課堂課件-第十二節(jié)字符串_第2頁(yè)
C語(yǔ)言新教材PPT課堂課件-第十二節(jié)字符串_第3頁(yè)
C語(yǔ)言新教材PPT課堂課件-第十二節(jié)字符串_第4頁(yè)
C語(yǔ)言新教材PPT課堂課件-第十二節(jié)字符串_第5頁(yè)
已閱讀5頁(yè),還剩44頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、P 23210.4 字符串的指針和指向字符串的指針變量 (一)字符串的表示形式 一、 一個(gè)字符串的表示形式(例 pencil )1用一個(gè)一維數(shù)組實(shí)現(xiàn) char c10=p,e,n,c,i,l,0 例1輸入一個(gè)單詞,將其逆序,然后輸出#include #include main char c10=p,e,n,c,i,l,0 ; char t ; int n , k; n=strlen ( c ) ; for ( k=0 ; k0)strcpy(t,c1); else strcpy(t,c2); char c110,c210; gets(c1); gets(c2); 輸入pencil book中間

2、以空格分隔, scanf以空格作為字符串結(jié)束輸入pencil book兩個(gè)字符串后面自動(dòng)加0兩個(gè)字符串后面自動(dòng)加0如果輸入:pencil bookruler eraser paperC1,輸入不結(jié)束c22用字符指針實(shí)現(xiàn) 例1. char *p=”pencil”; 例2. char a10,*p;p=a; scanf (”%s”,p);char *p;p=”pencil”;等價(jià)于讓p 指向字符串首地址pencil0p讓p 指向a0地址從鍵盤輸入字符串等價(jià)于for(i=0;i=9;i+)scanf(”%d”,ai);不允許: char *p;int *q; scanf ( ”%s” , p ) ;

3、 *q=5 ;P沒有指向那個(gè)單元,此時(shí)有可能指向系統(tǒng)、機(jī)器某個(gè)字節(jié),其中包含重要信息q沒有指向那個(gè)單元,此時(shí)q如果存放系統(tǒng)重要信息。給q賦值造成系統(tǒng)破壞,不過有保護(hù)例3. main() char *string=”I love China!”; printf(%sn,string);運(yùn)行結(jié)果:I love China! 一定要用此格式 字符串指針變量的定義說(shuō)明與指向字符變量的指針變量說(shuō)明是相同的。只能按對(duì)指針變量的賦值不同來(lái)區(qū)別。對(duì)指向字符變量的指針變量應(yīng)賦予該字符變量的地址。如: char c,*p=&c;char *s=C Language;p是一個(gè)指向字符變量c的指針變量s是一個(gè)指向字符

4、串的指針變量。把字符串的首地址賦予s例4. 輸出字符串中n個(gè)字符后的所有字符。main()char *ps=this is a book; int n=10; ps=ps+n; printf(%sn,ps);把字符串首地址賦予psthisbook0運(yùn)行結(jié)果:book例5.在輸入的字符串中查找有無(wú)k字符。main()char st20,*ps; int i; printf(input a string:n); ps=st; scanf(%s,ps); for(i=0;psi!=0;i+) if(psi=k) printf(“There is a k in the stringn); break;

5、 if(psi=0) printf(There is no k in the stringn);輸入:IBM Computer輸出:There is no k in the string 把字符串st首地址賦予ps3. 使用字符串指針變量與字符數(shù)組的區(qū)別 1)字符串指針變量本身是一個(gè)變量,用于存放字符串的首地址。而字符串本身是存放在以該首地址為首的一塊連續(xù)的內(nèi)存空間中并以0作為串的結(jié)束。字符數(shù)組是由于若干個(gè)數(shù)組元素組成的,它可用來(lái)存放整個(gè)字符串。2)對(duì)字符串指針方式:char *ps=“C Language”;等價(jià)于而對(duì)數(shù)組方式:static char st=C Language;寫成而只能對(duì)

6、字符數(shù)組的各元素逐個(gè)賦值。 char *ps;ps=“C Language”;char st20;st=“C Language”;3)當(dāng)一個(gè)指針變量在未取得確定地址前使用是危險(xiǎn)的,容易引起錯(cuò)誤。但是對(duì)指針變量直接賦值是可以的。因?yàn)镃系統(tǒng)對(duì)指針變量賦值時(shí)要給以確定的地址。因此,char *ps=C Langage;或者char *ps;ps=C Language;都是合法的。 例6輸出字符串中n個(gè)字符后的所有字符。main() char *ps=this is a book; int n=10; ps=ps+n; printf(%sn,ps);對(duì)ps初始化時(shí),即把字符串首地址賦予psps指向字符

7、“b”運(yùn)行結(jié)果:bookthisbook0二、多個(gè)字符串的表示形式 1用二維數(shù)組實(shí)現(xiàn) 例1main()char c520= ”pen”,”book”,”pencil”,”ruler”,”notebook”;char t20; int k ;gets (t);for(k=0;k5;k+) if ( strcmp(t,ck)=0)break;if(k5)printf(“%dn”,k);一維,存一個(gè)串二維,存多個(gè)串輸入一個(gè)串pen0book0pencil0ruler0notebook0比較后有兩種結(jié)果:含其中:k5不含其中:k=5按ASCII碼比不含其中,執(zhí)行后無(wú)反應(yīng)C0&c00例2 char c5

8、20 ; int k; for ( k=0;k5;k+)scanf(”%s”,ck); char c520 ; int k; for ( k=0;k5;k+) gets (ck); 一定要用字符串的格式符*(c+k)等價(jià)每行用空格分隔,不能用地址&,二維!每行用回車分隔,不能用地址&,二維!2用二維數(shù)組的行指針實(shí)現(xiàn)例4 char c520 , (*p)20 ; p=c; for ( ; pc+5 ; p+ ) gets ( *p ) ;3用字符指針實(shí)現(xiàn)例5 char c520 , *q ; q=*c; for ( ; q*(c+5) ; q+=20 ) gets ( q ) ; 定義一個(gè)行指針

9、行指針指向第一行每次循環(huán)輸入一行加一行*c為一維數(shù)組的地址q為指向二維數(shù)組元素的指針,加一行即加20個(gè)元素4用指針數(shù)組實(shí)現(xiàn)(節(jié)省內(nèi)存)例6把下面單詞排序(按詞典順序)#includemain ( )Char *p5= ”pen”,”book”,”pencil”,”ruler”,”notebook”;int i, j ; char *t ;for ( i=0 ; i=3 ; i+) for ( j=i+1 ; j0) t=pi;pi=pj;pj=t;for ( i=0 ; i=3 ; i+) printf ( ”%s” , pi ) ;printf ( ”n”); pen0book0P0P1pe

10、n0短的字符串后面有許多空格不調(diào)位置,讓pi指向改變,地址單元改變某字符地址上面pi 可用 *(p+i) 代替5.用指向指針的指針實(shí)現(xiàn)若有main ( )char *p5=”pen”,”book”,”pencil”, ”ruler”,”notebook”; int i, j ; char *t , *h ; h=p ;則上面pi 可用 *(h+i) 代替pj 可用 *(h+j) 代替 hp存p地址h+i 多個(gè)字符串的表示形式例7.一個(gè)指針數(shù)組的元素指向數(shù)據(jù)的簡(jiǎn)單例子。main()static int a5=1,3,5,7,9; int *num5=&a0,&a1,&a2,&a3,&a4; in

11、t *p,i; p=num; for(i=0;i5;i+) printf(%dt,*p);p+; 運(yùn)行結(jié)果:1 3 5 7 9指針數(shù)組的元素只能存放地址13579num0a0num1a1num2a2num3a3num4a4例8將指針變量指向一個(gè)格式字符串,用在printf函數(shù)中,用于輸出二維數(shù)組的各種地址表示的值。main()static int a34=0,1,2,3,4,5,6,7,8,9,10,11; char *PF; PF=%d,%d,%d,%d,%dn; printf(PF,a,*a,a0,&a0,&a00); printf(PF,a+1,*(a+1),a1,&a1,&a10);

12、printf(PF,a+2,*(a+2),a2,&a2,&a20); printf(%d,%dn,a1+1,*(a+1)+1); printf(%d,%dn,*(a1+1),*(*(a+1)+1);在printf語(yǔ)句中用指針變量PF代替了格式串運(yùn)行結(jié)果:404,404,404,404,404 412,412,412,412,412 420,420,420,420,420 414,414 5,5 例9把字符串指針作為函數(shù)參數(shù)使用:把一個(gè)字符串的內(nèi)容復(fù)制到另一個(gè)字符串中,不直接用strcpy函數(shù)。cpystr(char *pss,char *pds)while(*pds=*pss)!=0) pds

13、+; pss+; main()char *pa=CHINA,b10,*pb; pb=b; cpystr(pa,pb); printf(string a=%snstring b=%sn,pa,pb);兩個(gè)字符指針變量pss指向源字符串,pds指向目標(biāo)串運(yùn)行結(jié)果:string a=CHINA string a=CHINA 把pss指向的源字符串復(fù)制到pds所指向的目標(biāo)字符串中,所復(fù)制的字符為0,表明源字符串結(jié)束,不再循環(huán)。否則,pds和pss都加1,指向下一字符。P 24110.5 函數(shù)的指針和指向函數(shù)的指針變量函數(shù)的指針:對(duì)應(yīng)函數(shù)(已編譯的)在內(nèi)存中 的起始地址指向函數(shù)的指針變量:用來(lái)存放函數(shù)的

14、指針 (一) 指向函數(shù)的指針變量的定義和賦值: 一個(gè)函數(shù)總是占用一段連續(xù)的內(nèi)存區(qū),函數(shù)名就是該函數(shù)所占內(nèi)存區(qū)的首地址。 將函數(shù)的首地址(入口地址)賦予一個(gè)指針變量,使該指針變量指向該函數(shù)。通過指針變量就可以找到并調(diào)用這個(gè)函數(shù)。這種指針變量即“函數(shù)指針變量”。定義形式:類型說(shuō)明符 (*指針變量名)(); 被指函數(shù)的返回值的類型定義的指針變量表示指針變量所指的是一個(gè)函數(shù)例: int (*p)( ); float (*p)( ) ; int* (*p)( ); 賦值: 調(diào)用:p=函數(shù)名注意:如上所示定義和賦值后,可用 (*p) 代替對(duì)應(yīng)函數(shù)名 p可用來(lái)存放某函數(shù)的指針, 該函數(shù)的返回值為 int 類

15、型p可用來(lái)存放某函數(shù)的指針,該函數(shù)的返回值為 float 類型p用來(lái)存放某函數(shù)的指針,該函數(shù)的返回值為 int 指針類型(二)用途:用指向函數(shù)的指針變量作函數(shù)參數(shù)實(shí)際用途:編寫具有如下功能的函數(shù)用“二分法”計(jì)算f (x) 在 a , b 內(nèi)的一個(gè)根注意:與過去學(xué)的區(qū)別函數(shù)未具體指定?例10 計(jì)算其中f(x)=x2+4.8模擬積分梯形yxab模擬積分矩形yxabfloat f ( float x ) float g; g=x*x+4.8; return g ;float s(float a, float b, float(*p)( )int i ; float x1,x2,h,area=0; h

16、=(b-a)/50; for ( i=1;ib)return a; else return b;main()int max(int a,int b); int (*pmax)(); int x,y,z; pmax=max; printf(input two numbers:n); scanf(%d%d,&x,&y); z=(*pmax)(x,y); printf(maxmum=%d,z);輸入:12 8輸出:maxmum=12 函數(shù)申明定義一個(gè)指向函數(shù)的指針指向函數(shù)函數(shù)指針變量形式調(diào)用函數(shù)的步驟:1)先定義函數(shù)指針變量:如int (*pmax)()。2)把被調(diào)函數(shù)的入口地址(函數(shù)名)賦予該函

17、數(shù)指針變量,如 pmax=max。3)用函數(shù)指針變量形式調(diào)用函數(shù),如 z=(*pmax)(x,y);4)調(diào)用函數(shù)的一般形式為: (*指針變量名) (實(shí)參表)使用函數(shù)指針變量還應(yīng)注意以下兩點(diǎn):a)函數(shù)指針變量不能進(jìn)行算術(shù)運(yùn)算,這是與數(shù)組指針變量不同的。數(shù)組指針變量加減一個(gè)整數(shù)可使指針移動(dòng)指向后面或前面的數(shù)組元素,而函數(shù)指針的移動(dòng)是毫無(wú)意義的。b)函數(shù)調(diào)用中(*指針變量名)的兩邊的括號(hào)不可少,其中的*不應(yīng)該理解為求值運(yùn)算,在此處它只是一種表示符號(hào)。P245 10.6 指針型函數(shù)(返回指針值的函數(shù)) 函數(shù)的返回值是一個(gè)指針(即地址),此函數(shù)稱為指針型函數(shù)。定義指針型函數(shù)的一般形式為: 類型說(shuō)明符 *

18、函數(shù)名(形參表) 如: int *ap(int x,int y) . /*函數(shù)體*/函數(shù)體表明這是一個(gè)指針型函數(shù),返回值是一個(gè)指針。表示了返回的指針值所指向的數(shù)據(jù)類型。表示ap是一個(gè)返回指針值的指針型函數(shù),它返回的指針指向一個(gè)整型變量。 例1: void print( int x )printf( ”%dn”,x);例2: int len (char a )int k; while ( ak!=0)k+ +; return k; 不返回值的函數(shù)返回int類型值的函數(shù)例3:P383倒數(shù)第二個(gè)函數(shù)Char *strcat1( char *p , char *q ) char *w; w=p ; w

19、hile ( *p != 0) p+ +; while ( *q != 0) *p+ + = *q+ +; *p = 0 ; return w ; 返回char*類型值的函數(shù)字符型的指針變量存放函數(shù)值保留p原值(初始值),用p+移動(dòng)使p移到第一個(gè)串“0”最后一個(gè)“0”沒有接上,補(bǔ)一個(gè)abc0123450str1str2pqpq例12. 通過指針函數(shù),輸入一個(gè)17之間的整數(shù),輸出對(duì)應(yīng)的星期名。main() int i; char *day_name(int n); printf(input Day No:n); scanf(%d,&i); if(i%sn,i,day_name(i);char *

20、day_name(int n) static char *name = Illegal day, Monday,Tuesday, Wednesday,Thursday,Friday, aturday, Sunday; return(n7) ? name0 : namen);返回值指向一個(gè)字符串 條件表達(dá)式,n7或N1,name0指針返回給主函數(shù),輸出“Illegal day”。 條件語(yǔ)句,如輸入為負(fù)數(shù)(i0)則中止程序運(yùn)行退出程序。 exit()是一個(gè)庫(kù)函數(shù),exit(1)表示發(fā)生錯(cuò)誤后退出程序,exit(0)表示正常退出。 輸入:5輸出:Day No:5Friday函數(shù)指針變量和指針型函數(shù)在

21、寫法和意義上的區(qū)別如:int (*p)() 是一個(gè)變量說(shuō)明 int *p() 是函數(shù)說(shuō)明說(shuō)明p是一個(gè)指向函數(shù)入口的指針變量,該函數(shù)的返回值是整型量,(*p)的兩邊的括號(hào)不能少。說(shuō)明p是一個(gè)指針型函數(shù),其返回值是一個(gè)指向整型量的指針,*p兩邊沒有括號(hào)。函數(shù)說(shuō)明在括號(hào)內(nèi)最好寫入形式參數(shù),便于與變量說(shuō)明區(qū)別指針型函數(shù)定義,int *p()只是函數(shù)頭部分,一般還應(yīng)該有函數(shù)體部分。P 2310.7.3 main函數(shù)的參數(shù):P 253 10.7.3 指針數(shù)組作main函數(shù)的形參main函數(shù)有兩種形式,另一種形式如下:形式 main ( argc , argv ) int argc ; Char *argv

22、 ; 若在DOS狀態(tài)下啟動(dòng)執(zhí)行上面形式的C程序,則命令行應(yīng)為如下形式: 上面字符串不要用雙撇號(hào)括起來(lái) main函數(shù)可以帶參數(shù),這個(gè)參數(shù)可以認(rèn)為是 main函數(shù)的形式參數(shù)。 main函數(shù)的參數(shù)只能有兩個(gè):argc argv main函數(shù)的函數(shù)頭可寫為: main (argc,argv) 也可以寫成: main (int argc,char *argv )必須是整型變量必須是指向字符串的指針數(shù)組執(zhí)行情況: 計(jì)算機(jī)一開始執(zhí)行程序就把命令行中各字符串保存在內(nèi)存中且把它們的首地址分別賦給 argv0、argv1、argv2 ,把字符串的個(gè)數(shù)(包括表示文件主名字符串)賦給argc上面形式的C程序一般含有這

23、樣的程序段:對(duì)指針數(shù)組argv和 argc 處理 由于main函數(shù)不能被其它函數(shù)調(diào)用,因此不可能在程序內(nèi)部取得實(shí)際值。main函數(shù)的參數(shù)值是從操作系統(tǒng)命令行上獲得的。當(dāng)我們要運(yùn)行一個(gè)可執(zhí)行文件時(shí),在DOS提示符下鍵入文件名,再輸入實(shí)際參數(shù)即可把這些實(shí)參傳送到main的形參中去。DOS提示符下命令行的一般形式為: C:可執(zhí)行文件名 參數(shù) 參數(shù); 注意:main 的兩個(gè)形參和命令行中的參數(shù)在位置上不是一一對(duì)應(yīng)的。因?yàn)?main的形參只有二個(gè),而命令行中的參數(shù)個(gè)數(shù)原則上未加限制。argc參數(shù)表示了命令行中參數(shù)的個(gè)數(shù)(注意:文件名本身也算一個(gè)參數(shù)),argc的值是在輸入命令行時(shí)由系統(tǒng)按實(shí)際參數(shù)的個(gè)數(shù)自

24、動(dòng)賦予的。 例如有命令行為: C:E24 BASIC foxpro FORTRAN 由于文件名E24本身也算一個(gè)參數(shù),所以共有4個(gè)參數(shù),因此argc取得的值為4。argv參數(shù)是字符串指針數(shù)組,其各元素值為命令行中各字符串(參數(shù)均按字符串處理)的首地址。指針數(shù)組的長(zhǎng)度即為參數(shù)個(gè)數(shù)。數(shù)組元素初值由系統(tǒng)自動(dòng)賦予。其表示如圖:例 編寫 與Max 命令同功能的程序Max 命令格式: Max 功能: x顯示較大的字符串main ( argc , argv )int argc ;char* argv ;if(argc!=3) printf (”令行中字符串個(gè)數(shù)錯(cuò)誤”); exit(0);else print

25、f(”%sn”,strcmp(argv1 ,argv2)0 ? argv1 : argv2) ; 條件表達(dá)式,如果指向首地址,則打出字符串將程序編譯、鏈接,生成Max.EXE文件例13. main(int argc,char *argv) while(argc-1) printf(%sn,*+argv);本例是顯示命令行中輸入的參數(shù)。如果上例的可執(zhí)行文件名為e24.exe,存放在A驅(qū)動(dòng)器的盤內(nèi)。因此輸入的命令行為:C:a:e24 BASIC foxpro FORTRAN 則運(yùn)行結(jié)果為:BASIC foxpro FORTRAN 該行共有4個(gè)參數(shù),執(zhí)行main時(shí),argc的初值即為4。argv的4個(gè)元素分為4個(gè)字符串的首地址。每循環(huán)一次argv值減1,argv等于1時(shí)停止共循環(huán)三次,輸出三個(gè)參數(shù)。在printf函數(shù)中,由于打印項(xiàng)*+argv是先加1再打印,故第一次打印的是argv1所指的字符串BASIC。第二、三次循環(huán)分別打印后二個(gè)字符串。而參數(shù)e24是文

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論