C语言新教材PPT课堂课件-第十二节字符串_第1页
C语言新教材PPT课堂课件-第十二节字符串_第2页
C语言新教材PPT课堂课件-第十二节字符串_第3页
C语言新教材PPT课堂课件-第十二节字符串_第4页
C语言新教材PPT课堂课件-第十二节字符串_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、P 23210.4 字符串的指针和指向字符串的指针变量 (一)字符串的表示形式 一、 一个字符串的表示形式(例 pencil )1用一个一维数组实现 char c10=p,e,n,c,i,l,0 例1输入一个单词,将其逆序,然后输出#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以空格作为字符串结束输入pencil book两个字符串后面自动加0两个字符串后面自动加0如果输入:pencil bookruler eraser paperC1,输入不结束c22用字符指针实现 例1. char *p=”pencil”; 例2. char a10,*p;p=a; scanf (”%s”,p);char *p;p=”pencil”;等价于让p 指向字符串首地址pencil0p让p 指向a0地址从键盘输入字符串等价于for(i=0;i=9;i+)scanf(”%d”,ai);不允许: char *p;int *q; scanf ( ”%s” , p ) ;

3、 *q=5 ;P没有指向那个单元,此时有可能指向系统、机器某个字节,其中包含重要信息q没有指向那个单元,此时q如果存放系统重要信息。给q赋值造成系统破坏,不过有保护例3. main() char *string=”I love China!”; printf(%sn,string);运行结果:I love China! 一定要用此格式 字符串指针变量的定义说明与指向字符变量的指针变量说明是相同的。只能按对指针变量的赋值不同来区别。对指向字符变量的指针变量应赋予该字符变量的地址。如: char c,*p=&c;char *s=C Language;p是一个指向字符变量c的指针变量s是一个指向字符

4、串的指针变量。把字符串的首地址赋予s例4. 输出字符串中n个字符后的所有字符。main()char *ps=this is a book; int n=10; ps=ps+n; printf(%sn,ps);把字符串首地址赋予psthisbook0运行结果:book例5.在输入的字符串中查找有无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. 使用字符串指针变量与字符数组的区别 1)字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以0作为串的结束。字符数组是由于若干个数组元素组成的,它可用来存放整个字符串。2)对字符串指针方式:char *ps=“C Language”;等价于而对数组方式:static char st=C Language;写成而只能对

6、字符数组的各元素逐个赋值。 char *ps;ps=“C Language”;char st20;st=“C Language”;3)当一个指针变量在未取得确定地址前使用是危险的,容易引起错误。但是对指针变量直接赋值是可以的。因为C系统对指针变量赋值时要给以确定的地址。因此,char *ps=C Langage;或者char *ps;ps=C Language;都是合法的。 例6输出字符串中n个字符后的所有字符。main() char *ps=this is a book; int n=10; ps=ps+n; printf(%sn,ps);对ps初始化时,即把字符串首地址赋予psps指向字符

7、“b”运行结果:bookthisbook0二、多个字符串的表示形式 1用二维数组实现 例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);一维,存一个串二维,存多个串输入一个串pen0book0pencil0ruler0notebook0比较后有两种结果:含其中:k5不含其中:k=5按ASCII码比不含其中,执行后无反应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)等价每行用空格分隔,不能用地址&,二维!每行用回车分隔,不能用地址&,二维!2用二维数组的行指针实现例4 char c520 , (*p)20 ; p=c; for ( ; pc+5 ; p+ ) gets ( *p ) ;3用字符指针实现例5 char c520 , *q ; q=*c; for ( ; q*(c+5) ; q+=20 ) gets ( q ) ; 定义一个行指针

9、行指针指向第一行每次循环输入一行加一行*c为一维数组的地址q为指向二维数组元素的指针,加一行即加20个元素4用指针数组实现(节省内存)例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短的字符串后面有许多空格不调位置,让pi指向改变,地址单元改变某字符地址上面pi 可用 *(p+i) 代替5.用指向指针的指针实现若有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 多个字符串的表示形式例7.一个指针数组的元素指向数据的简单例子。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+; 运行结果:1 3 5 7 9指针数组的元素只能存放地址13579num0a0num1a1num2a2num3a3num4a4例8将指针变量指向一个格式字符串,用在printf函数中,用于输出二维数组的各种地址表示的值。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语句中用指针变量PF代替了格式串运行结果:404,404,404,404,404 412,412,412,412,412 420,420,420,420,420 414,414 5,5 例9把字符串指针作为函数参数使用:把一个字符串的内容复制到另一个字符串中,不直接用strcpy函数。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);两个字符指针变量pss指向源字符串,pds指向目标串运行结果:string a=CHINA string a=CHINA 把pss指向的源字符串复制到pds所指向的目标字符串中,所复制的字符为0,表明源字符串结束,不再循环。否则,pds和pss都加1,指向下一字符。P 24110.5 函数的指针和指向函数的指针变量函数的指针:对应函数(已编译的)在内存中 的起始地址指向函数的指针变量:用来存放函数的

14、指针 (一) 指向函数的指针变量的定义和赋值: 一个函数总是占用一段连续的内存区,函数名就是该函数所占内存区的首地址。 将函数的首地址(入口地址)赋予一个指针变量,使该指针变量指向该函数。通过指针变量就可以找到并调用这个函数。这种指针变量即“函数指针变量”。定义形式:类型说明符 (*指针变量名)(); 被指函数的返回值的类型定义的指针变量表示指针变量所指的是一个函数例: int (*p)( ); float (*p)( ) ; int* (*p)( ); 赋值: 调用:p=函数名注意:如上所示定义和赋值后,可用 (*p) 代替对应函数名 p可用来存放某函数的指针, 该函数的返回值为 int 类

15、型p可用来存放某函数的指针,该函数的返回值为 float 类型p用来存放某函数的指针,该函数的返回值为 int 指针类型(二)用途:用指向函数的指针变量作函数参数实际用途:编写具有如下功能的函数用“二分法”计算f (x) 在 a , b 内的一个根注意:与过去学的区别函数未具体指定?例10 计算其中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 函数申明定义一个指向函数的指针指向函数函数指针变量形式调用函数的步骤:1)先定义函数指针变量:如int (*pmax)()。2)把被调函数的入口地址(函数名)赋予该函

17、数指针变量,如 pmax=max。3)用函数指针变量形式调用函数,如 z=(*pmax)(x,y);4)调用函数的一般形式为: (*指针变量名) (实参表)使用函数指针变量还应注意以下两点:a)函数指针变量不能进行算术运算,这是与数组指针变量不同的。数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的。b)函数调用中(*指针变量名)的两边的括号不可少,其中的*不应该理解为求值运算,在此处它只是一种表示符号。P245 10.6 指针型函数(返回指针值的函数) 函数的返回值是一个指针(即地址),此函数称为指针型函数。定义指针型函数的一般形式为: 类型说明符 *

18、函数名(形参表) 如: int *ap(int x,int y) . /*函数体*/函数体表明这是一个指针型函数,返回值是一个指针。表示了返回的指针值所指向的数据类型。表示ap是一个返回指针值的指针型函数,它返回的指针指向一个整型变量。 例1: void print( int x )printf( ”%dn”,x);例2: int len (char a )int k; while ( ak!=0)k+ +; return k; 不返回值的函数返回int类型值的函数例3:P383倒数第二个函数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*类型值的函数字符型的指针变量存放函数值保留p原值(初始值),用p+移动使p移到第一个串“0”最后一个“0”没有接上,补一个abc0123450str1str2pqpq例12. 通过指针函数,输入一个17之间的整数,输出对应的星期名。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);返回值指向一个字符串 条件表达式,n7或N1,name0指针返回给主函数,输出“Illegal day”。 条件语句,如输入为负数(i0)则中止程序运行退出程序。 exit()是一个库函数,exit(1)表示发生错误后退出程序,exit(0)表示正常退出。 输入:5输出:Day No:5Friday函数指针变量和指针型函数在

21、写法和意义上的区别如:int (*p)() 是一个变量说明 int *p() 是函数说明说明p是一个指向函数入口的指针变量,该函数的返回值是整型量,(*p)的两边的括号不能少。说明p是一个指针型函数,其返回值是一个指向整型量的指针,*p两边没有括号。函数说明在括号内最好写入形式参数,便于与变量说明区别指针型函数定义,int *p()只是函数头部分,一般还应该有函数体部分。P 2310.7.3 main函数的参数:P 253 10.7.3 指针数组作main函数的形参main函数有两种形式,另一种形式如下:形式 main ( argc , argv ) int argc ; Char *argv

22、 ; 若在DOS状态下启动执行上面形式的C程序,则命令行应为如下形式: 上面字符串不要用双撇号括起来 main函数可以带参数,这个参数可以认为是 main函数的形式参数。 main函数的参数只能有两个:argc argv main函数的函数头可写为: main (argc,argv) 也可以写成: main (int argc,char *argv )必须是整型变量必须是指向字符串的指针数组执行情况: 计算机一开始执行程序就把命令行中各字符串保存在内存中且把它们的首地址分别赋给 argv0、argv1、argv2 ,把字符串的个数(包括表示文件主名字符串)赋给argc上面形式的C程序一般含有这

23、样的程序段:对指针数组argv和 argc 处理 由于main函数不能被其它函数调用,因此不可能在程序内部取得实际值。main函数的参数值是从操作系统命令行上获得的。当我们要运行一个可执行文件时,在DOS提示符下键入文件名,再输入实际参数即可把这些实参传送到main的形参中去。DOS提示符下命令行的一般形式为: C:可执行文件名 参数 参数; 注意:main 的两个形参和命令行中的参数在位置上不是一一对应的。因为,main的形参只有二个,而命令行中的参数个数原则上未加限制。argc参数表示了命令行中参数的个数(注意:文件名本身也算一个参数),argc的值是在输入命令行时由系统按实际参数的个数自

24、动赋予的。 例如有命令行为: C:E24 BASIC foxpro FORTRAN 由于文件名E24本身也算一个参数,所以共有4个参数,因此argc取得的值为4。argv参数是字符串指针数组,其各元素值为命令行中各字符串(参数均按字符串处理)的首地址。指针数组的长度即为参数个数。数组元素初值由系统自动赋予。其表示如图:例 编写 与Max 命令同功能的程序Max 命令格式: Max 功能: x显示较大的字符串main ( argc , argv )int argc ;char* argv ;if(argc!=3) printf (”令行中字符串个数错误”); exit(0);else print

25、f(”%sn”,strcmp(argv1 ,argv2)0 ? argv1 : argv2) ; 条件表达式,如果指向首地址,则打出字符串将程序编译、链接,生成Max.EXE文件例13. main(int argc,char *argv) while(argc-1) printf(%sn,*+argv);本例是显示命令行中输入的参数。如果上例的可执行文件名为e24.exe,存放在A驱动器的盘内。因此输入的命令行为:C:a:e24 BASIC foxpro FORTRAN 则运行结果为:BASIC foxpro FORTRAN 该行共有4个参数,执行main时,argc的初值即为4。argv的4个元素分为4个字符串的首地址。每循环一次argv值减1,argv等于1时停止共循环三次,输出三个参数。在printf函数中,由于打印项*+argv是先加1再打印,故第一次打印的是argv1所指的字符串BASIC。第二、三次循环分别打印后二个字符串。而参数e24是文

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论