第10章 字符串 (2).ppt
第十章第十章 字符串字符串计算机二级辅导办公室计算机二级辅导办公室10.1 用一维字符数组存放字符串用一维字符数组存放字符串字符串的相关概念字符串的相关概念lC语言对字符串的处理方式语言对字符串的处理方式l字符串是借助于一维字符数组存放的,但两者并不等价字符串是借助于一维字符数组存放的,但两者并不等价l字符串总是以字符串总是以0作为串结束标志作为串结束标志l0占用存储空间,但所说的串长不包括占用存储空间,但所说的串长不包括0l字符串常量的相关概念字符串常量的相关概念l字符串常量用字符串常量用“”把有效字符包含,不必加把有效字符包含,不必加0l字符串常量实际是以字符串常量实际是以0结尾的无名字但有地址的一维结尾的无名字但有地址的一维数组数组l字符串常量可以赋值给字符指针变量,但不能赋给一个已字符串常量可以赋值给字符指针变量,但不能赋给一个已经定义了的一维字符数组经定义了的一维字符数组例如例如:char*sp,s10;则:则:s=“hello!”;sp=“hello!”;l字符数组和字符串的区别字符数组和字符串的区别l字符数组的每一个元素都可以是任意字符字符数组的每一个元素都可以是任意字符l字符串是由字符数组中第一个字符串是由字符数组中第一个0和前面的字符所组成和前面的字符所组成的的1.赋初值方式同一般数组赋初值方式同一般数组 例题如下例题如下:1.char str10=s,t,r,i,n,g,!,0 等价于:等价于:2.char str=s,t,r,i,n,g,!,0;等价于:等价于:分析:分析:char str=s,t,r,i,n,g,!;1.在赋初值时直接赋字符串常量在赋初值时直接赋字符串常量 例题如下例题如下:1.char str 10=“string!”;等价于等价于 char str 10=“string!”;2.char str=“string!”;不等价于不等价于 char str7=“string!”;q通过赋初值方式给一维字符数组赋字符串通过赋初值方式给一维字符数组赋字符串string!0 0 0string!0l不可以用赋值语句给字符数组整体赋一串字符不可以用赋值语句给字符数组整体赋一串字符 1.char mark10;mark=“computer”;2.char m10=“good!”;char n10;n=m;l给数组元素逐个赋字符值给数组元素逐个赋字符值,最后人为加入串结束标志最后人为加入串结束标志 1.char m10;m0=s;m1=t;m2=r;m9=0;2.char mark10;int i;for(i=0;i9;i+)scanf(“%c”,&marki);marki=0;q在在C程序执行过程中给一维字符数组赋字符串程序执行过程中给一维字符数组赋字符串 10.2 使指针指向一个字符串使指针指向一个字符串q通过赋初值的方式使指针指向一个字符串通过赋初值的方式使指针指向一个字符串可以在定义字符指针变量的同时,将存放字符串的存储单元起始可以在定义字符指针变量的同时,将存放字符串的存储单元起始地址赋给指针变量地址赋给指针变量例如:例如:char*ps=“string”;这里将把字符串常量的无名存储区的首地址赋给了指针这里将把字符串常量的无名存储区的首地址赋给了指针psq通过赋值运算使指针指向一个字符串通过赋值运算使指针指向一个字符串1.charstr=“formtwo”,*ps2;ps2=str;等价于等价于:charstr=“formtwo”,*ps2;ps2=&str0;2.char*ps;ps=“string”;q用字符数组作为字符串和用指针指向的一个字符串之间的区别用字符数组作为字符串和用指针指向的一个字符串之间的区别charmark=“Aprogram”;和和char*pmark=“Aprogram”;区别是区别是:内容相同,存储结构不同,占的存储空间不同内容相同,存储结构不同,占的存储空间不同;10.3 字符串的输入和输出字符串的输入和输出q逐个字符输入和输出:逐个字符输入和输出:%c 例例:main()charstr5;inti;for(i=0;i4;i+)scanf(“%c”,&stri);stri=0;for(i=0;i5;i+)printf(“%c”,stri);q输入和输出字符串时的必要条件输入和输出字符串时的必要条件(串整体串整体%s)字符串进行字符串进行输出输出时,输出项是字符串或字符数组时,输出项是字符串或字符数组名或是已指向字符串的字符指针变量名或是已指向字符串的字符指针变量字符串进行字符串进行输入输入时,输入项是字符数组名或指针时,输入项是字符数组名或指针q用格式说明符用格式说明符%s进行进行整输入和输出整输入和输出:用用%s输入和输出的形式为输入和输出的形式为:scanf(“%s”,str_adr);其中其中str_adr是地址值是地址值printf(“%s”,str_adr);其中其中str_adr是地址值是地址值注意注意:1.用用%s s输入字符串时输入字符串时,空格和回车符都作为输入数空格和回车符都作为输入数 据据的的2.分隔符而不分隔符而不 能被读入!能被读入!2.2.输入字符串长度大于数组字符个数输入字符串长度大于数组字符个数,系统不报错系统不报错3 3.输入项为字符指针时输入项为字符指针时,该指针已指向确定的有足够空该指针已指向确定的有足够空间的连续存储单元间的连续存储单元4.4.当输入项是数组元素的地址时当输入项是数组元素的地址时,输入数据将从这一元素输入数据将从这一元素开始存放开始存放.lgets函数的调用形式为:函数的调用形式为:gets(str_adr);其中其中str_adr是存放输入字符串的起始地是存放输入字符串的起始地址,可以是字符数组名、字符指针或字符数址,可以是字符数组名、字符指针或字符数组元素的地址组元素的地址例如:例如:charstr20;gets(str);注意:此种方式输入的字符串中可以有空格注意:此种方式输入的字符串中可以有空格lputs函数的调用形式为:函数的调用形式为:puts(str_adr);其中其中str_adr是存待输出字符串的起始地址是存待输出字符串的起始地址q调用调用gets、puts函数在终端输入或输出一行字符串函数在终端输入或输出一行字符串#includemain()chara15,b5,c5;scanf(%s%s%s,a,b,c);printf(a=%snb=%snc=%sn,a,b,c);scanf(%s,a);printf(a=%sn,a);运行情况:输入:Howareyou?输出:a=Howb=arec=you?输入:Howareyou?输出:a=How若准备将字符串若准备将字符串“Thisisastring.”记录下来记录下来,错误的输入语句错误的输入语句为:为:(A)scanf(“%20s”,s);(B)for(k=0;k17;k+)sk=getchar();(C)while(c=getchar()!=n)sk+=c;例题分析例题分析例题例题 将字符串将字符串a复制到字符串复制到字符串bmain()char a=“I am a boy.”,b20;int i;for(i=0;*(a+i)!=0;i+)*(b+i)=*(a+i);*(b+i)=0;printf(“string a is:%sn”,a);printf(“string b is:”);for(i=0;bi!=0;i+)printf(“%c”,bi);printf(“n”);main()char a=“I am a boy.”,b20;char*p1,*p2;int i;P1=a;p2=b;for(;*p1!=0;p1+,p2+)*p2=*p1;*p2=0;printf(“string a is:%sn”,a);printf(“string b is:”);for(i=0;bi!=0;i+)printf(“%c”,bi);printf(“n”);q字符串与字符数组关系小结字符串与字符数组关系小结字符串用一维字符数组存放字符串用一维字符数组存放字符数组具有一维数组的所有特点字符数组具有一维数组的所有特点数组名是指向数组首地址的地址常量数组名是指向数组首地址的地址常量数组元素的引用方法可用指针法和下标法数组元素的引用方法可用指针法和下标法数组名作函数参数是地址传递等数组名作函数参数是地址传递等区别区别存储格式:字符串结束标志存储格式:字符串结束标志赋值方式与初始化赋值方式与初始化输入输出方式:输入输出方式:%s%ccharstr=“Hello!”;()charstr=“Hello!”;()charstr=H,e,l,l,o,!;()char*cp=“Hello”;()inta=1,2,3,4,5;()int*p=1,2,3,4,5;()charstr10,*cp;inta10,*p;str=“Hello”;()cp=“Hello!”;()a=1,2,3,4,5;()p=1,2,3,4,5;()scanf(“%s”,str);()printf(“%s”,str);()gets(str);()puts(str);()q字符串数组的定义与实现字符串数组的定义与实现 字符串数组就是数组中的每个元素又都是一个存字符串数组就是数组中的每个元素又都是一个存放字符串的数组。用二维字符数组就可以实现。放字符串的数组。用二维字符数组就可以实现。例例如如:char name1080;其其中中第第一一维维下下标标决定字符串的个数,第二维决定字符串最大长度决定字符串的个数,第二维决定字符串最大长度 10.4 字符串数组字符串数组q字符串数组可以在定义的同时赋初值字符串数组可以在定义的同时赋初值 例如:例如:char ca34=“A”,“BB”,“CCC”;ca0A0ca1BB0ca2CCC0q可以定义字符型指针数组并通过赋初值来构成可以定义字符型指针数组并通过赋初值来构成一类似的字符串数组一类似的字符串数组例如:例如:char*pa3=“a”,“bb”,“ccc”;pa0pa1pa2a0bb0ccc0例题:字符指针数组应用举例例题:字符指针数组应用举例将若干字符串按字母顺序(由小到大)输出将若干字符串按字母顺序(由小到大)输出main()void sort();void print();static char*name=“Followme”,”BASIC”,“Great Wall”,“FORTRAN”,“Computer design”;int n=5;sort(name,n);print(name,n);voidsort(char*name,intn;)char*temp;inti,j,k;for(i=0;in-1;i+)k=i;for(j=i+1;j0)k=j;if(k!=i)temp=namei;namei=namek;namek=temp;voidprint(char*name,intn;)inti;for(i=0;in;i+)printf(“%sn”,namei);10.5 用于字符串处理的函数用于字符串处理的函数l字符串拷贝函数字符串拷贝函数strcpystrcpy 格式:格式:strcpy(sstrcpy(s1,1,s s2)2)功能:将功能:将s s2 2所指字符串所指字符串,拷贝到,拷贝到s s1 1所指所指字符空间字符空间中中 返值:返回返值:返回s s1 1的首地址的首地址 说明:说明:字符数组字符数组1 1必须足够大必须足够大 拷贝时拷贝时s2s2的的00一同拷贝一同拷贝 不能使用赋值语句为一个字符数组赋值不能使用赋值语句为一个字符数组赋值l字符串连接函数字符串连接函数strcatstrcat 格式:格式:strcatstrcat(s(s1,1,s s2)2)功能:把功能:把s s2 2所指字符串的内容连到所指字符串的内容连到s s1 1所指字符串后面所指字符串后面 返值:返回字符数组返值:返回字符数组1 1的首地址的首地址 说明:说明:字符数组字符数组1 1必须足够大必须足够大 连接前连接前,两串均以两串均以00结束结束;连接后连接后,串串1 1的的00 取消取消,新串最后加新串最后加00例例strcpy与与strcat举例举例#include#includevoidmain()chardestination25;charblank=,c=C+,turbo=Turbo;strcpy(destination,turbo);strcat(destination,blank);strcat(destination,c);printf(%sn,destination);l求字符串长度函数求字符串长度函数strlenstrlen 格式:格式:strlenstrlen(s(s)功能:计算功能:计算s s为起始地址的为起始地址的字符串的长度字符串的长度 返值:返回字符串实际长度,不包括返值:返回字符串实际长度,不包括00在内在内l字符串比较函数字符串比较函数strcmpstrcmp 格式:格式:strcmpstrcmp(s(s1,1,s s2)2)功能:比较功能:比较s1,s2s1,s2所指所指字符串的大小字符串的大小 比较规则:对两串从左向右逐个字符比较(比较规则:对两串从左向右逐个字符比较(ASCIIASCII码),直码),直 到遇到不同字符或到遇到不同字符或00为止为止 返值返值:返回返回intint型整数型整数;a.a.若字符串若字符串1 1 1 字符串字符串2 2,返回正整数,返回正整数 c.c.若字符串若字符串1=1=字符串字符串2 2,返回零,返回零 说明:字符串比较不能用说明:字符串比较不能用“=”,必须用必须用strcmpstrcmp#include#includemain()charstr1=”Hello!,str2=”Howareyou?”,str20;intlen1,len2,len3;len1=strlen(str1);len2=strlen(str2);if(strcmp(str1,str2)0)strcpy(str,str1);strcat(str,str2);elseif(strcmp(str1,str2)s2,函数返回值为函数返回值为正数正数;若串若串s1=s2,函数返回值为函数返回值为0;若串若串s10)printf(“str1str2n”);elseif(scomp(str1,str2)0)printf(“str1str2n”);elseprintf(“str1=str2n”);例例10.4 编写程序从终端读入若干文本行(不超过编写程序从终端读入若干文本行(不超过40行,每行不超过行,每行不超过60个字符),遇空行结束输入。然后个字符),遇空行结束输入。然后将此文本左侧加上行号后输出。将此文本左侧加上行号后输出。#include“stdio.h”#defineMAXLINE40#defineLEN61voidgettext(char(*)LEN,int*);voidputtext(charLEN,int);main()chartextMAXLINELEN;intn;gettext(text,&n);puttext(text,n);voidgettext(char(*t)LEN,int*m);intn;printf(“entertextline,endedtoemptyline:n”);n=0;gets(tn);while(*tn)n+;gets(tn);*m=n;voidputtext(chartLEN,intn)inti;for(i=0;in;i+)printf(“%-2d:”,i+1);puts(ti);例例10.5 编写程序从输入的若干字符串中找出最小的编写程序从输入的若干字符串中找出最小的串进行输出。串进行输出。#include“stdio.h”#include“string.h”#defineN20#defineM81getstr(charpM)chartM,n=0;printf(“enterstringaemptystringtoendn”);gets(t);while(strcmp(t,”)strcpy(pn,t);n+;gets(t);returnn;char*findmin(char(*a)M,intn)char*q;inti;q=a0;for(i=1;in;i+)if(strcmp(ai,q)0)q=ai;returnq;main()charsNM,*sp;intn;n=getstr(s);sp=findmin(s,n);puts(sp);10.1以下能正确进行字符串赋值,赋初值的语句是A)chars5=a,e,i,o,u;B)char*s;s=good!;C)chars5=good!;D)chars5;s=good!;第十章课后题答案第十章课后题答案:10.2以下程序段的输出结果是charstr=ABCD,*p=str;printf(%dn,*(p+4);A)68B)0C)字符D的地址D)不确定的值10.3语句printf(%dn,strlen(ATSn0121);的输出结果是A)11B)10C)9D)810.4当运行以下程序时输入OPENTHEDOOR(此处代表Enter键),则输出结果是charfun(char*c)if(*c=A)*c-=A-a;return*c;main()chars81,*p=s;gets(s);while(*p)*p=fun(p);putchar(*p);p+;putchar(n);10.5以下程序的输出结果是以下程序的输出结果是#includestdio.h#includestring.hvoidfun(char*w,intm)chars,*p1,*p2;p1=w;p2=w+m-1;while(p1p2)s=*p1+;*p1=*p2-;*p2=s;main()chara=ABCDEFG;fun(a,strlen(a);puts(a);10.6以下程序的输出结果是以下程序的输出结果是main()chars=ABCD,*p;for(p=s;ps+4;p+)printf(%sn,p);A)ABCDB)AC)DD)ABCDBCDBCABCCDCBABDDAA10.7设有如下定义:char*aa2=abcd,ABCD;则以下说法中正确的是A)aa数组元素的值分别是abcd和ABCDB)aa是指针变量,它指向含有两个数组元素的字符型一维数组C)aa数组的两个元素分别存放的是含有四个字符的一维数组的首地址D)aa数组的两个元素中各自存放了字符a和A的地址10.8以下程序的输出结果是main()charch25=6937,8254,*p2;inti,j,s=0;for(i=0;i2;i+)pi=chi;for(i=0;i0&pij=9;j+=2)s=10*s+pij-0;printf(%dn,s);A)6385B)69825C)63825D)69382510.9以下程序的输出结果是main()char*alpha6=ABCD,EFGH,IJKL,MNOP,QRST,UVWX;char*p;inti;p=alpha;for(i=0;in)t=a+k-n;while(*t)ai=*t+;i+;ai=0;voidfun(intaN,intm)inti,j;for(i=0;iN;i+)for(j=i;jN;j+)aij=aij*m;95:假定输入的字符串中只包含字母和:假定输入的字符串中只包含字母和*号。请编写函数号。请编写函数fun,它的功能是:使字符串的前导它的功能是:使字符串的前导*号不得多于号不得多于n个;若多于个;若多于n个,个,则删除多余的则删除多余的*号;若少于或等于号;若少于或等于n个,则什么也不做。字符串个,则什么也不做。字符串中间和尾部的中间和尾部的*号不删除。在编写函数时,不得使用号不删除。在编写函数时,不得使用c语言提供语言提供的字符串函数。的字符串函数。42:下列程序定义了:下列程序定义了NN的二维的二维数组,并在主函数中自动赋值。数组,并在主函数中自动赋值。请编写函数请编写函数fun(intaN,intn),该该函数的功能是:将数组右上半三函数的功能是:将数组右上半三角元素中的值乘以角元素中的值乘以m。10.19 请编写函数请编写函数mygets和和myputs,其功能分别与其功能分别与gets和和puts相同,函数中用相同,函数中用getchar和和putchar读入和输出字符。读入和输出字符。#include“stdio.h”#defineM100main()chartM;mygets(t);myputs(t);mygets(char*p)charc;while(c=getchar()!=n)*p=c;p+;*p=0;myputs(char*q)while(*q)putchar(*q);q+;10.20 请编写函数,判断一字符串是否是回文。若是回文函数返请编写函数,判断一字符串是否是回文。若是回文函数返回值为回值为1;否则返回值为;否则返回值为0。回文是顺读和倒读都一样的字符串。回文是顺读和倒读都一样的字符串。main()inti;chars50;gets(s);i=huiwen(s);if(i=1)printf(“thestringishuiwen!”);elseprintf(“thestringisnthuiwen!”);huiwen(char*p)inti,j;i=0;j=strlen(p)-1;while(pi=pj)&(i=j)return1;elsereturn0;10.21 请编写函数,删除字符串中指定位置上的字请编写函数,删除字符串中指定位置上的字符。删除成功函数返回被删字符;否则返回空值。符。删除成功函数返回被删字符;否则返回空值。#include“stdio.h”main()intn;charc;chars50;gets(s);scanf(“%d”,&n);c=dele(s,n);puts(s);if(c!=NULL)printf(“%c”,c);elseprintf(“NULL”);dele(char*p,intn)inti;if(nstrlen(p)|n0)returnNULL;for(i=n;istrlen(p);i+)pi=pi+1;pstrlen(p)=0;returnpn;第十章第十章结束结束