资源预览内容
第1页 / 共40页
第2页 / 共40页
第3页 / 共40页
第4页 / 共40页
第5页 / 共40页
第6页 / 共40页
第7页 / 共40页
第8页 / 共40页
第9页 / 共40页
第10页 / 共40页
亲,该文档总共40页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第十章字符串n n知识点知识点1 1:字符串:字符串n n1.1.字符串常量字符串常量n n(1 1)C C语言中字符串常量的形式,用一对双引号将一语言中字符串常量的形式,用一对双引号将一串字符括起来称为字符串常量。串字符括起来称为字符串常量。n n例如:例如:“ “abcdabcd” ”. .n n(2 2)字符串的长度。一对双引号中字符的个数就是字)字符串的长度。一对双引号中字符的个数就是字符串的长度。可调用符串的长度。可调用strlenstrlen函数求字符串长度,例如函数求字符串长度,例如,strlen(,strlen(“ “abcdabcd” ”) ),字符串的长度为,字符串的长度为4.4.n n(3 3)字符串的结束标志。在字符串最后一个字符的后)字符串的结束标志。在字符串最后一个字符的后面,系统自动添加一个转义字符面,系统自动添加一个转义字符 00 作为字符串的作为字符串的结束标志。当人为地在字符串中间插入转义字符结束标志。当人为地在字符串中间插入转义字符 00 时,例:时,例:“ “a0bcda0bcd” ”, ,系统就认为字符串到系统就认为字符串到a a为为止,长度为止,长度为1 1,不再顾及,不再顾及00后的字符。后的字符。1n n(4)字符串常量的存储结构。1个字符串所占字节数为:字符串长度+1.例如字符串“abcd”,在内存上5个字节,其字符占4个字节,字符串结束标志0占一个字节。可调用sizeof函数求字符串所占字节数,如:sizeof(“abcd”).n n(5)字符串常量的面值和地址值。“abcd”是字符串的面值,而当把它赋给某个变量时,给出的是此字符串在内存所占连续存储区的首地址。2n n2.一维字符数组和字符串变量n n(1)一维字符数组的每个元素可以存放一个字符。n n(2)当一维字符数组中存放最后一个字符是0时,可称此一维字符数组内存放了一个字符串,同时可称此一维数组为字符串变量。n n3.通过赋初值给一维字符数组赋字符串n n赋字符串初值形式:n n(1)char s5=a,b,c,d,0;显示赋字符串结束标志。n n(2) char s5=a,b,c,d;系统会自动赋字符串结束标志。3n n(3)char s5=“abcd”;直接赋字符串常量。n n(4)char s5=“abcd”;把字符串常量放在一对花括号中。n n(5)char s=“abcd”;根据所赋字符串初值来确定数组长度。 n n注意,若有定义:char s5=“aa”;,sizeof(s)的值为5,strlen(s)的值为2.前者是s在内存中所中字节数,后者是s中的字符个数。4n n10-1有以下程序n n main()n n char a=a,b,c,d,e,f,g,h,0;n n int i,j;n n i=sizeof(a);n n j=strlen(a);n n printf(“%d,%dn”,i,j);n n n n程序运行后结果是n nA.9,9 B.8,9 C.8,8 D.9,85n n10-2有以下程序n n#include n n main()n n char *p=“abcde0fghjik0”;n n printf(“%dn”,strlen(p);n n n n程序运行后结果是n nA.12B.15C.6D.56n n10-3以下不能正确进行字符串赋初值的语句是n nA. char str5=“good!”;n nB. char str=“good!”;n nC. char *str=“good!”;n nD. char str5=g,o,o,d;7n n10-4有以下程序n n main()n n char p20,*q=p;n nscanf(“%s %s”,p,q); printf(“%s %sn”,p,q);n nn n若从键盘输入:abc def,则输出结果是n nA.def defn nB.abc defn nC.abc dn nD.d d8n n10-5有以下程序n nmain( )n n char s =“ABCD”, *p;n n for (p=s+1;ps+4;p+) n n printf(“%sn”,p);n n n n程序运行结果是n nA. ABCD B. A C. B D. BCDn n BCD B C CDn n CD C D Dn n D D 9n n4.4.程序中给一维字符数组赋字符串程序中给一维字符数组赋字符串n n有定义有定义char s5;char s5;n n(1 1)不可以用赋值语句给)不可以用赋值语句给s s数组赋字符串。例如,数组赋字符串。例如,s=s=“ “abcdabcd” ”; ;是错误的,数组名是错误的,数组名s s是一个常量,不可重是一个常量,不可重新赋值。新赋值。n n(2 2)可给数组元素一个一个赋字符:)可给数组元素一个一个赋字符:n ns0=s0= a a ;s1=;s1= b b ; ;。n n(3 3)可调用)可调用strcpystrcpy函数把字符串复制到数组中。例如,函数把字符串复制到数组中。例如,strcpy(s,strcpy(s,“ “abcdabcd” ”).).n n(4 4)若有定义:)若有定义:char s110,s220;,char s110,s220;,可用可用%s%s格式,格式,调用调用scanfscanf函数给字符数组输入字符串。例如,函数给字符数组输入字符串。例如,scanf(scanf(“ “%s%s%s%s” ”,s1,s2);.,s1,s2);.n n(5 5)用)用getsgets函数给字符数组输入一行字符串。例如,函数给字符数组输入一行字符串。例如,gets(s1);gets(s2);.gets(s1);gets(s2);.输入的一串字符用回车结束。输入的一串字符用回车结束。10n n5.使指针指向字符串n n(1)给基类型为char的指针赋字符串的地址,可通过以下赋初值方式使指针指向字符串常量。n n char *sp=“abcd”;把字符串“abcd”的首地址赋给基类型为char的指针变量。指针sp指向一个具有5个字节的连续存储区的开头,即指向字符a所在存储单元。n n char *sp=“abcd”;同上11n n(2)通过赋值语句给基类型为char的指针赋字符串。若有定义语句:char *sp;,则可通过赋值语句:sp=“abcd”;,把字符串“abcd”的首地址赋给指针变量sp。n n(3)若有以上定义和赋值语句,sp+;将移动指针sp,使其指向字符串中的字符b,这时sp指向字符串“bcd”.12n n10-6下列选项中正确的语句组是n nA. char s8; s=“Beijing”;n nB. char s8; s= “Beijing”;n nC. char *s; s=“Beijing”;n nD. char *s; s= “Beijing”;13n n6.通过指针引用字符串中的字符n n(1)若有定义:char *sp=“abcd”;,*sp代表字母a,*(sp+1)代表字母b,。n n(2)若有以上定义,sp0代表字母a,sp1代表字母b,。n n7.字符串的输出n n(1)可以调用printf函数,用%s格式输出字符数组中的字符串和字符指针所指的字符串。n n(2)可以调用puts函数,输出字符数组中的字符串和字符指针所指的字符串。14n n知识点2:字符串数组n n1.字符串数组赋值n n在二维字符数组的每一行存放一个字符串,此二维数组构成字符串数组。n n(1)例如,以下定义语句通过赋初值给每行赋字符串n n char s1380=“aa”,”bbbb”,”543211”,s2380;n n(2)可调用strcpy函数给每行赋字符串。n n for(i=0;i3;i+) strcpy(s2i,s1i);15n n(3)可通过输入语句给每行赋字符串。n n for(i=0;i3;i+) scanf(“%s”,s2i);n n(4)不可用赋值语句给每行赋字符串。n n for(i=0;i3;i+) s2i=s1i;是错误的。注意,s2i是地址常量,不能赋值。16n n2.通过一个一维指针数组构成一个字符串数组n n(1)例如,以下定义语句通过赋初值建立一个字符串数组n n char *sp3=“aa”,”bbbb”,”543211”;n n以上定义在内存构成如图所示的存储结构17n n(2)特点n n由此方式构成的存储结构每行的长度可以不一;n n可以给spi重新赋值,指针数组中每个元素的地址值可以改变,因为spi是变量。n n当spi没有指向确定的存储空间时,不可以通过scanf函数或gets函数给它赋字符串。n n(3)引用每个字符元素。n n按以上定义,若i和j有正确定义和赋值,可通过*(spi+j)或spij的形式引用每个字符。18n n10-7以下程序的输出结果是n n#include n n#include n n main()n n char b18=abcdefg,b28,*pb=b1+3;n n while(-pb =b1) strcpy(b2,pb);n n printf(“%dn”,strlen(b2);n n A.8B.3C.1D.719n n10-810-8有以下程序有以下程序n n char cchar(char ch)char cchar(char ch)n n if (ch= if (ch= A A & ch= & ch= Z Z ) ch=ch-) ch=ch- A A + + a a ; ;n n return ch; return ch;n n n n main() main()n n char s= char s=“ “ABC+abc=defDEFABC+abc=defDEF” ”,*p=s;,*p=s;n n while(*p) while(*p)n n *p=cchar(*p); *p=cchar(*p);n n p+; p+;n n printf( printf(“ “%sn%sn” ”,s);,s);n n n nA. abc+ABC=DEFdefA. abc+ABC=DEFdefB. abc+abc=defdefB. abc+abc=defdefn nC. abcABCDEFdefC. abcABCDEFdefD. abcabcdefdefD. abcabcdefdef20n n10-910-9有以下程序有以下程序n n void ss(char *s, char t)void ss(char *s, char t)n n while(*s) while(*s)n n if(*s=t) *s=t- if(*s=t) *s=t- a a + + A A ; ;n n s+; s+;n n n n n n main() main()n n char str1100= char str1100=“ “abcddfefdbdabcddfefdbd” ”,c=,c= d d ; ;n n ss(str1,c); printf( ss(str1,c); printf(“ “%sn%sn” ”,str1);,str1);n n n nA. ABCDDEFEDBDA. ABCDDEFEDBDB. abcDDfefDbDB. abcDDfefDbDn nC. abcAAfefAbAC. abcAAfefAbAD. AbcddfefdbdD. Abcddfefdbd21n n10-10以下程序的输出结果是n n main()n n char s=“abcdef”;n n s3=0;n n printf(“%sn”,s);n n 22n n10-11以下程序运行后的输出结果是n n main()n n char a=“Language”,b=“Programe”;n n char *p1,*p2; int k;n n p1=a; p2=b;n n for(k=0;k=7;k+)n n if(*(p1+k)=*(p2+k) printf(“%c”,*(p1+k);n n 23第十一章对函数的进一步讨论第十一章对函数的进一步讨论n n知识点1:main函数的参数n n1.执行程序时的命令行n n(1)C程序经过编译连接之后,将自动生成后缀为.exe的可执行文件。例如名为myp.c的C源程序,生成的可执行文件名为myp.exe。n n(2)在操作系统的提示符下,打入myp,就可执行myp程序, myp就被称为执行命令。所在行称为命令行。n n(3)在命令行中不仅有命令,其后还可跟随若干参数,通常各参数由空格隔开。每个参数由一串字符组成。例如:myp hello worldn n其中hello和world就是参数。24n n(4)系统将自动开辟存储区存放这些字符串,并如图所示通过无名指针数组指向字符串。25n n2.main2.main函数后一对括号中的形参函数后一对括号中的形参n n(1 1)在运行)在运行C C程序时,可以通过命令行把参数传给程序时,可以通过命令行把参数传给mainmain函数的形参,从而把命令行中的参数传给函数的形参,从而把命令行中的参数传给mainmain函数。函数。n n(2 2)mainmain函数通常可用两个参数。例如:函数通常可用两个参数。例如:n n main(int arge,char *argv)main(int arge,char *argv) 或或n n main(int arge,char *argv) main(int arge,char *argv) n n其中其中argearge和和argvargv是用户标识符,用作形参,可取任何合是用户标识符,用作形参,可取任何合法的名字。法的名字。n n(3 3)argearge中将存放命令行中字符串的个数。中将存放命令行中字符串的个数。n n(4 4)形参)形参argvargv被定义为指向指针的指针,它指向指针被定义为指向指针的指针,它指向指针数组始元素。因此,通过数组始元素。因此,通过argvargv可以引用命令行中的任一可以引用命令行中的任一字符串,例如,对于上面的命令行,字符串,例如,对于上面的命令行,argv0argv0指向字符指向字符串串myp,argv1myp,argv1指向字符串指向字符串hello,argv2hello,argv2指向字符串指向字符串worldworld。26n n例:若以下程序放在例:若以下程序放在myp.cmyp.c文件中,在编译连接后,已文件中,在编译连接后,已生成一个生成一个myc.exemyc.exe文件,输出文件,输出argcargc和和argvargv中的数据中的数据n n main(int argc,char *argv)main(int argc,char *argv)n n int i; int i;n n printf( printf(“ “argc=%dnargc=%dn” ”,argc);,argc);n n for(i=1;iargc;i+) for(i=1;iargc;i+)n n printf( printf(“ “%s %s “ “,argvi);,argvi);n n printf( printf(“ “nn” ”););n n若在命令行中打入:若在命令行中打入:n n myc A COMMAND LINEmyc A COMMAND LINEn n程序将输出:程序将输出:n n argc=4argc=4n n A COMMAND LINE A COMMAND LINE27n n11-1不合法的main函数命令行参数表示形式是n nA. main(int a,char *c)n nB. main(int arc,char *arv)n nC. main(int argc,char *argv)n nD. main(int argv,char *argc)28n n11-2有以下程序n n#include n n main(int argc,char *argv)n n int i,len=0;n n for(i=1;iargc;i+) n n len+=strlen(argvi);n n printf(“%dn”,len);n n程序编译连接后生成的可执行文件是ex1.exe,若运行输入的带参数的命令行是:n nex1abcdefg10n nA.22B.17C.12D.9 29n n知识点2:函数的递归调用n n(1)C语言中函数可以递归调用,即可以自己调用自己,也可以间接地调用自己。n n(2)分析递归调用的程序时需要建立以下概念。n n每一层调用时,系统将为本次调用所用到的形参和函数中定义的变量开辟独立的存储单元。所以分析时必需清楚是在哪一层调用,以及该层中各变量的值。n n递归算法必定有结束递归的条件,不可能无限递归下去,因此注意递归结束条件,然后有序地一层一层返回,有函数值的,同时返回函数值。元函数值的一定要注意本层中各变量的值。30n n11-3在函数调用过程中,如果函数funA调用了函数funB,函数funB又调用了函数funA,是n nA.称为函数的直接递归调用n nB.称为函数的间接递归调用n nC.称为函数的循环调用n nD.C语言中不允许这样的递归调用31n n11-411-4有以下程序有以下程序n n void fun(int *a, int i, int j)void fun(int *a, int i, int j)n n int t; int t;n n if(ij) if(ij)n n t=ai;ai=aj;aj=t; t=ai;ai=aj;aj=t;n n i+; j-; i+; j-;n n fun(a,i,j); fun(a,i,j);n n n n n n main() main()n nint x=2,6,1,8,i;int x=2,6,1,8,i;n n fun(x,0,3); fun(x,0,3);n n for(i=0;i4;i+) printf( for(i=0;i4;i+) printf(“ “%2d%2d” ”,xi);,xi);n n printf( printf(“ “nn” ”););n n n nA.1 2 6 8A.1 2 6 8B.8 6 2 1B.8 6 2 1 C.8 1 6 2 C.8 1 6 2 D.8 6 1 2 D.8 6 1 232n n11-5有以下程序n n int f(int n)n n if(n=1) return 1;n n else return f(n-1)+1;n nn n main()n n int i,j=0;n n for(i=1;i3;i+) j+=f(i);n n printf(“%dn”,j);n nn n程序运行结果n nA.4B.3C.2D.133n n11-611-6有以下程序有以下程序n n void f(int a, int i, int j)void f(int a, int i, int j)n n int t; int t;n n if(ij) if(ij)n n t=ai; ai=aj; aj=t; t=ai; ai=aj; aj=t;n n f(a,i+1,j-1); f(a,i+1,j-1);n n n n n n main() main()n nint i,aa5=1,2,3,4,5;int i,aa5=1,2,3,4,5;n n f(aa,0,4); f(aa,0,4);n n for(i=0;i5;i+) printf( for(i=0;i5;i+) printf(“ “%d,%d,” ”,aai);,aai);n n printf( printf(“ “nn” ”););n n程序执行结果程序执行结果n nA.5,4,3,2,1A.5,4,3,2,1B.5,2,3,4,1B.5,2,3,4,1C.1,2,3,4,5C.1,2,3,4,5n nD.1,5,4,3,2D.1,5,4,3,234n n知识点3:指向函数的指针n n1.C语言中,函数名代表一个地址值,从这个地址开始存放函数的执行代码,称为函数的入口。所以不能把函数名作为变量,重新给它赋值。n n2.指向函数的指针。函数指针的定义有以下两种形式。n n(1)第1种形式:n n类型名 (*指针变量名)();n n例如,int (*fp)();。说明了fp是一个指向函数的指针变量,它可以指向任何函数值为int类型的函数。35n n(2)第2种形式:n n类型名 (*指针变量名)(类型名,类型名);n n例如,int (*fp)(int ,int ,int );。说明了fp是一个指向函数的指针变量,它可以指向任何函数值为int类型且具有3个int类型形参的函数。n n(3)注意,*fp外的一对圆括号不可省略,不能写成:int *fp(int ,int ,int );,此处,不再说明fp是一个指针变量,而是说明fp是一个函数名,此函数返回一个基类型为int的地址。这是一条函数说明语句。n n(4)注意,若函数没有形参,说明符后面的一对括号也不能省略。36n n(5)对于不同类型的指针变量,其定义格式不同。下图为有关指针的数据类型小结。定义格式含义int *pP为指针变量,用于指向整型数据的指针元素组成int *pnP为指针数组,它由n个指向整型数据的指针元素组成int (*p)nP为行指针,指向一个含有n个元素的一维数组int *p()P为指针函数,该函数返回一个基类型为整型的指针int (*p)()P为函数指针,p所指函数返回一个整型值int *pP是一个指针变量,它指向一个指向整型数据的指针变量37n n3.函数名作为实参。C语言中,函数名可以作为实参,这时对应的形参必须是一个类型相同的函数指针。n n4.通过函数指针调用函数。n n若有以下定义的说明n n int findbig(int,int,int);n n int (*f)(int,int,int),x,y,z,big;n n则可通过以下方式调用findbig函数:n nf=findbig;n nbig=(*f)(x,y,z);38n n11-711-7有以下程序有以下程序n n int fa(int x)int fa(int x)n n return x*x; return x*x;n n int fb(int x) int fb(int x)n n return x*x*x; return x*x*x;n n int f(int (*f1)(int), int (*f2)(int), int x) int f(int (*f1)(int), int (*f2)(int), int x)n n return (*f2)(x)-(*f1)(x); return (*f2)(x)-(*f1)(x);n n main() main()n n int i; i=f(fa,fb,2); printf( int i; i=f(fa,fb,2); printf(“ “%dn%dn” ”,i);,i);n n程序运行后结果程序运行后结果n nA. -4A. -4B. 1B. 1C. 4C. 4D. 8D. 839n n11-8在说明语句:int *f();中,标识符f代表的是n nA.一个用于指向整型数据的指针变量n nB.一个用于指向一维数组的行指针n nC.一个用于指向函数的指针变量n nD.一个返回值为指针型的函数名40
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号