北大的高级程序设计 CPP08-5课件_第1页
北大的高级程序设计 CPP08-5课件_第2页
北大的高级程序设计 CPP08-5课件_第3页
北大的高级程序设计 CPP08-5课件_第4页
北大的高级程序设计 CPP08-5课件_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

程序设计实习第五讲字符串处理,2008年3月5日,1,PPT学习交流,内容提要,字符串的存储、字符串处理函数将数组传递给函数程序阅读练习程序设计练习作业,PPT学习交流,字符串,每个字符串是一个特殊的数组,满足两个条件元素的类型为char最后一个元素的值为0以字符型数组存储从0号元素开始存储最大可以存储长度为N-1的字符串,N是数组的大小。字符串“hello”在长度为10的字符串数组中的存储,h,e,l,l,o,0,PPT学习交流,字符串处理函数,将格式化数据写入字符串:sprintf字符串长度查询函数:strlen字符串复制函数:strcpy、strncpy字符串连接函数:strcat字符串比较函数:strcmp、strncmp、stricmp、strnicmp字符串搜索函数:strcspn、strspn、strstr、strtok、strchr字符串大小写转换函数:strlwr、strupr,PPT学习交流,把”helloworld”复制到str2,把str2复制到str1,查询str1中字符串的长度,strcpy、strlen,#include#includevoidmain()charstr110=hello,str212;strcpy(str2,helloworld);printf(length:%d(str1);%d(str2)n,strlen(str1),strlen(str2);strcpy(str1,str2);printf(length:%d(str1);%d(str2)n,strlen(str1),strlen(str2);printf(%sn,str1);return;,PPT学习交流,Outputlength:5(str1);11(str2)length:11(str1);11(str2)helloworldstr1存储了11个非n字符?strcpy在复制字符串str2到str1时,不检查str2是否超出了str1的存储容量,而是直接将str2中存储的字符串复制到从str1开始的一段连续区域在程序中要特别注意这种情况所引发的程序运行不确定性,PPT学习交流,h,e,l,l,o,0,str1,str2,h,e,l,l,o,0,str1,h,e,l,l,o,w,o,r,l,d,0,str2,strcpy(str2,helloworld);,h,e,l,l,o,str1,h,e,l,l,o,w,o,r,l,d,0,str2,strcpy(str1,str2);,w,o,r,l,d,0,main(),PPT学习交流,把”world”添加到str1中原字符串的末尾,strcat,#include#includevoidmain()charstr115=hello,str25=_,str35=!;strcat(str1,world);printf(%sn,str1);strcat(str1,str2);printf(%sn,str1);strcat(str1,str3);printf(%sn,str1);return;,把str2中的字符串添加到str1中原字符串的末尾,PPT学习交流,h,e,l,l,o,0,str1,-,0,str2,main(),strcat(str1,world);,!,0,!,!,0,str3,h,e,l,l,o,w,o,r,l,str1,d,0,-,0,str2,!,!,0,str3,strcat(str1,str2);,h,e,l,l,o,w,o,r,l,str1,d,-,0,-,0,str2,!,!,0,str3,strcat(str1,str3);,h,e,l,l,o,w,o,r,l,str1,d,-,!,-,0,str2,!,!,0,str3,PPT学习交流,strcmp、stricmp,#include#includecharstring1=Thequickbrowndogjumpsoverthelazyfox;charstring2=TheQUICKbrowndogjumpsoverthelazyfox;voidmain(void)intresult;printf(Comparestrings:nt%snt%snn,string1,string2);result=strcmp(string1,string2);printf(strcmp:result=%dn,result);result=stricmp(string1,string2);printf(stricmp:result=%dn,result);return;,PPT学习交流,Output:strcmp:result=1strcmp:result=0,PPT学习交流,字符串比较函数汇总,strcmp(constchar*s1,constchar*s2):对串s1和s2进行无符号比较,直至对应字符不同或到串尾stricmp(constchar*s1,constchar*s2):对串s1和s2进行无符号比较,忽略字符的大小写strncmp(constchar*s1,constchar*s2,size_tmaxlen):对串s1和s2进行无符号比较,最多只比较maxlen个字符strnicmp:对串s1和s2进行无符号比较,忽略字符的大小写,最多只比较maxlen个字符,PPT学习交流,字符串搜索函数汇总,strchr(constchar*s,charc):在串s中正向查找字符cstrstr(constchar*s1,constchar*s2):在串s1中找串s2的第一次出现strcspn(constchar*s1,constchar*s2):在串s1中找“串s2中任何字符”出现的第一次位置strspn(constchar*s1,constchar*s2):在串s1中找“不是串s2字符”的第一次出现位置strtok(constchar*s1,constchar*s2):将s1看成包含0个或多个文本单词的序列,由分隔符串s2中1个或多哦个字符分隔第一次调用strtok时,返回指向s1中第一个单词的第一个字符,并在返回单词好后立即写0到s1中第一个单词的尾部之后后继的调用用NULL作为第一个参数,将继续用这种方法扫描s1,直到没有剩余单词,PPT学习交流,strstr,#include#includecharstr=lazy;charstring=Thequickbrowndogjumpsoverthelazyfox;voidmain(void)char*pdest;intresult;pdest=strstr(string,str);result=pdest-string+1;if(pdest!=NULL)printf(%sfoundatposition%dnn,str,result);elseprintf(%snotfoundn,str);,在string中搜索str,返回str在string中第一次出现的位置,PPT学习交流,strchr,#include#includeintch=r;charstring=Thequickbrowndogjumpsoverthelazyfox;voidmain(void)char*pdest;intresult;pdest=strchr(string,ch);result=pdest-string+1;if(pdest!=NULL)printf(Result:tfirst%cfoundatposition%dnn,ch,result);elseprintf(Result:t%cnotfoundn);,在string中搜索ch,返回str在string中第一次出现的位置,PPT学习交流,#include#includeintmain(void)char*string1=1234567890;char*string2=747DC8;intlength;length=strcspn(string1,string2);printf(Characterwherestringsintersectisatposition%dn,length);return0;输出:Characterwherestringsintersectisatposition3,strcspn,PPT学习交流,#include#includeintmain(void)char*string1=1234567890;char*string2=123DC8;intlength;length=strspn(string1,string2);printf(Characterwherestringsdifferisatposition%dn,length);return0;输出:Characterwherestringsdifferisatposition3,strspn,PPT学习交流,#include#includeintmain(void)charinput16=abc,de,f;char*p;/*strtokplacesaNULLterminatorinfrontofthetoken,iffound*/p=strtok(input,);if(p)printf(%sn,p);/*AsecondcalltostrtokusingaNULLasthefirstparameterreturnsapointertothecharacterfollowingthetoken*/p=strtok(NULL,);,strtok,PPT学习交流,while(p)printf(%sn,p);p=strtok(NULL,);printf(%sn,input);return0;输出:abcdefabc,PPT学习交流,数组作为函数的参数:以地址方式传递参数,voidmyFunction(charstr,intarray,intlength)printf(stringinmyFunction:%sn,str);if(strlen(str)10)strcpy(str,newstring);elsestrcpy(str,);for(inti=0;ilength;i+)arrayi=0;return;,PPT学习交流,#include#includevoidmyFunction(charstr,intarray,intlength);voidmain()charstring=helloworld;intintArray5=1,2,3,4,5,i;printf(stringinmain:%sn,string);printf(theelementsofintArrayare:);for(i=0;i5;i+)printf(%d,intArrayi);printf(n);myFunction(string,intArray,5);printf(stringinmain:%sn,string);printf(theelementsofintArrayare:);for(i=0;i5;i+)printf(%d,intArrayi);return;,PPT学习交流,Output:stringinmain:helloworldtheelementsofintArrayare:12345stringinmyFunction:helloworldstringinmain:newstringtheelementsofintArrayare:00000,PPT学习交流,数组作为函数的参数,注意事项(1)用数组名作函数参数,应该在调用函数和被调用函数中分别定义数组,且数据类型必须一致,否则结果将出错。(2)C编译系统对形参数组大小不作检查,所以形参数组可以不指定大小。如果指定形参数组的大小,则实参数组的大小必须大于等于形参数组,否则因形参数组的部分元素没有确定值而导致计算结果错误。,PPT学习交流,多维数组作为函数的参数,二维数组名做函数参数时,形参的语法形式是:类型说明符形参名常量表达式M形参数组可以省略一维的长度。由于实参代表了数组名,是“地址传递”,二维数组在内存中是按行优先存储,并不真正区分行与列,在形参中,就必须指明列的个数,才能保证实参数组与形参数组中的数据一一对应,因此,形参数组中第二维的长度是不能省略的。调用函数时,与形参数组相对应的实参数组必须也是一个二维数组,而且它的第二维的长度与形参数组的第二维的长度必须相等。,PPT学习交流,intmax_value(intarray4,introw)inti,j,k,max;max=array00;for(i=0;imax)max=arrayij;return(max);voidmain(void)staticinta34=1,3,5,7,2,4,6,8,15,17,34,12;printf(maxvalueis%dn,max_value(a,3);,PPT学习交流,程序设计练习:POJ1298,问题描述JuliusCaesar生活在充满危险和阴谋的年代。为了生存,他首次发明了密码,用于军队的消息传递假设你是Caesar军团中的一名军官,需要把Caesar发送的消息破译出来、并提供给你的将军。消息加密的办法是:对消息原文中的每个字母,分别用该字母之后的第5个字母替换(例如:消息原文中的每个字母A都分别替换成字母F),其他字符不变,并且消息原文的所有字母都是大写的。,PPT学习交流,输入最多不超过100个数据集组成。每个数据集由3部分组成起始行:START密码消息:由1到200个字符组成一行,表示Caesar发出的一条消息结束行:END在最后一个数据集之后,是另一行:ENDOFINPUT输出每个数据集对应一行,是Caesar的原始消息。,密码字母:ABCDEFGHIJKLMNOPQRSTUVWXYZ原文字母:VWXYZABCDEFGHIJKLMNOPQRSTU,PPT学习交流,样例输入STARTNSBFW,JAJSYXTKNRUTWYFSHJFWJYMJWJXZQYTKYWNANFQHFZXJXENDSTARTNBTZQIWFYMJWGJKNWXYNSFQNYYQJNGJWNFSANQQFLJYMFSXJHTSINSWTRJENDSTARTIFSLJWPSTBXKZQQBJQQYMFYHFJXFWNXRTWJIFSLJWTZXYMFSMJENDENDOFINPUT样例输出INWAR,EVENTSOFIMPORTANCEARETHERESULTOFTRIVIALCAUSESIWOULDRATHERBEFIRSTINALITTLEIBERIANVILLAGETHANSECONDINROMEDANGERKNOWSFULLWELLTHATCAESARISMOREDANGEROUSTHANHE,PPT学习交流,解题思路,没有难度,关键在于会使用strcmp、strcat、strlenstrcmp:识别输入数据中消息行的开始和结束strcat:将消息行中单词后添加空格strlen:计算加密消息中每个单词的长度要注意:scanf、cin每次只读一个单词(WORD)。在密码消息行中,通常有多个单词,单词之间以空格分隔,PPT学习交流,#include#includevoiddecipher(charmessage);voidmain()charcipher201,message201;scanf(%s,cipher);while(strcmp(cipher,START)=0)decipher(message);printf(%sn,message);scanf(%s,cipher);return;,PPT学习交流,voiddecipher(charmessage)charplain27=VWXYZABCDEFGHIJKLMNOPQRSTU,cipher201;inti,wordLen;scanf(%s,cipher);message0=0;while(strcmp(cipher,END)!=0)wordLen=strlen(cipher);for(i=0;i=A,PPT学习交流,另一种解法,输入以行入读gets:读入一行字符串,允许字符串中包含空格cin.getline按行置换,PPT学习交流,#include#include#includevoiddecode(char*message);voidmain()charcipher201;while(1)cin.getline(cipher,200);if(stricmp(cipher,START)=0)continue;elseif(stricmp(cipher,END)=0)continue;elseif(stricmp(cipher,ENDOFINPUT)=0)break;elsedecode(cipher);coutcipherendl;,PPT学习交流,voiddecode(char*message)charplain27=VWXYZABCDEFGHIJKLMNOPQRSTU;intwordlen=strlen(message);for(inti=0;i9)carry=1;producti=producti-10;elsecarry=0;return(carry);,高精度数相加,进位处理,问题:为什么carry0就表示这个数不是循环数?,以“字符+数”的方式来实现加法,同时使结果为字符串型,PPT学习交流,课堂练习:POJ1936,问题描述:给定两个字符串s和t,请判断s是否是t的子序列。即从t中删除一些字符,将剩余的字符连接起来,即可获得s。输入:包括若干个测试数据。每个测试数据由两个ASCII码的数字和字母串s和t组成,s和t的长度不超过100000。输出:对每个测试数据,如果s是t的子序列则输出“Yes”,否则输出“No”。,PPT学习交流,样例输入sequencesubsequencepersoncompressionVERDIvivaVittorioEmanueleReDiItaliacaseDoesMatterCaseDoesMatter样例输出YesNoYesNo,PPT学习交流,解题方法1:组合使用各种字符串查找函数,strncpy(constchar*s1,constchar*s2,size_tmaxlen):从s2中到s1拷贝maxlen个字符strchr(constchar*s,charc):在串s中正向查找

温馨提示

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

评论

0/150

提交评论