您好,欢迎访问三七文档
程序设计实习第三讲字符串处理内容提要字符串的存储、字符串处理函数将数组传递给函数例题:ai2767Caesar密码(P115)例题:单词排序例题:ai2744子串(P112)例题:POJ1936AllinAll字符串每个字符串是一个特殊的数组,满足两个条件元素的类型为char最后一个元素的值为‘\0’,Ascii码就是0以字符型数组存储从0号元素开始存储最大可以存储长度为N-1的字符串,N是数组的大小。字符串“hello”在长度为10的字符串数组中的存储hello\0字符串处理函数将格式化数据写入字符串:sprintf字符串长度查询函数:strlen字符串复制函数:strcpy、strncpy字符串连接函数:strcat字符串比较函数:strcmp、strncmp、stricmp、strnicmp字符串搜索函数:strcspn、strspn、strstr、strtok、strchr字符串大小写转换函数:strlwr、strupr这些函数都要求#includestring.h把”helloworld”复制到str2把str2复制到str1查询str1中字符串的长度字符串拷贝和求字符串长度char*strcpy(char*dest,constchar*src);intstrlen(constchar*s);#includestdio.h#includestring.hvoidmain(){charstr1[10]=hello,str2[12];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(%s\n,str1);return;}输出结果:length:5(str1);11(str2)length:11(str1);11(str2)helloworldstr1存储了11个非’\0’字符?strcpy在复制字符串str2到str1时,不检查str2是否超出了str1的存储容量,而是直接将str2中存储的字符串复制到从str1开始的一段连续区域在程序中要特别注意这种情况所引发的程序运行不确定性hello\0str1str2main()hello\0str1helloworld\0str2strcpy(str2,“helloworld);hellostr1helloworld\0str2strcpy(str1,str2);world\0用strlen时常犯的错误intMyStrchr(char*s,charc)//看s中是否包含c{for(inti=0;istrlen(s)-1;i++)if(s[i]==c)return1;return0;}哪里不好?这个函数执行时间和s的长度是什么关系?strlen是一个o(N)的函数,每次判断istrlen(s)–1都要执行,太浪费时间了#includestdio.h#includestring.hvoidmain(){charstr1[100]=hello,str2[10]=^_^;strcat(str1,world);printf(%s\n,str1);strcat(str1,str2);printf(%s\n,str1);return;}把”world”添加到str1中原字符串的末尾字符串添加strcat把str2中的字符串添加到str1中原字符串的末尾char*strcat(char*dest,constchar*src);把src内容加到dest后面,同样不会考虑dest是否够长输出:helloworldhelloworld^_^字符串比较函数strcmp(分大小写)、stricmp(不分大小写)intstrcmp(constchar*s1,constchar*s2);intstricmp(constchar*s1,constchar*s2);ReturnValueIfs1is...returnvalueis...lessthans20thesameass2==0greaterthans20Comparesonestringtoanother,withoutcasesensitivity.ReturnValueIfs1is...returnvalueis...lessthans20thesameass2==0greaterthans20关于stricmp的注意事项stricmp不是严格意义上的C++标准库函数,所以不同编译器的实现有所不同。比如在POJ上交题,编译器选C++时,该函数应写为:_stricmp不同编译器的_stricmp库函数执行过程也可能不一样,有的是把小写转换成大写后比较,有的是把大写转换成小写后比较,所以,在待比较字符串里面有非字母字符,比如标点符号时,不同编译器的_stricmp执行的结果有可能不同字符串比较函数strcmp、stricmp#includestring.h#includestdio.hcharstring1[]=Thequickbrowndogjumpsoverthelazyfox;charstring2[]=TheQUICKbrowndogjumpsoverthelazyfox;voidmain(void){intresult;printf(Comparestrings:\n\t%s\n\t%s\n\n,string1,string2);result=strcmp(string1,string2);printf(strcmp:result=%d\n,result);result=stricmp(string1,string2);printf(stricmp:result=%d\n,result);return;}输出:Comparestrings:ThequickbrowndogjumpsoverthelazyfoxTheQUICKbrowndogjumpsoverthelazyfoxstrcmp:result=1stricmp:result=0查找子串strstrchar*strstr(char*s1,char*s2);Scansastringfortheoccurrenceofagivensubstring.查找给定字符串在字符串中第一次出现的位置,返回位置指针strstrscanss1forthefirstoccurrenceofthesubstrings2.ReturnValuestrstrreturnsapointertotheelementins1,wheres2begins(pointstos2ins1).Ifs2doesnotoccurins1,strstrreturnsnull.如果找到,返回指针,指向s1中第一次出现s2的位置如果找不到,返回NULL查找子串strstr#includestring.h#includestdio.hcharstr[]=lazy;charstring[]=Thequickbrowndogjumpsoverthelazyfox;voidmain(void){char*pdest;intresult;pdest=strstr(string,str);result=pdest-string+1;if(pdest!=NULL)printf(%sfoundatposition%d\n\n,str,result);elseprintf(%snotfound\n,str);}输出:lazyfoundatposition36在string中搜索str,返回str在string中第一次出现的位置在字符串中查找字符strchrchar*strchr(char*s,intc);Scansastringforthefirstoccurrenceofagivencharacter.查找给定字符在字符串中第一次出现的位置,返回位置指针strchrscansastringintheforwarddirection,lookingforaspecificcharacter.strchrfindsthefirstoccurrenceofthecharactercinthestrings.ReturnValuestrchrreturnsapointertothefirstoccurrenceofthecharactercins;ifcdoesnotoccurins,strchrreturnsnull.在字符串中查找字符strchr#includestring.h#includestdio.hintch='r';charstring[]=Thequickbrowndogjumpsoverthelazyfox;voidmain(void){char*pdest;intresult;pdest=strchr(string,ch);result=pdest-string+1;if(pdest!=NULL)printf(Result:\tfirst%cfoundatposition%d\n\n,ch,result);elseprintf(Result:\t%cnotfound\n);}输出:Result:firstrfoundatposition12在string中搜索ch,返回str在string中第一次出现的位置字符串部分拷贝strncpychar*strncpy(char*dest,char*src,intmaxlen);将前maxlen个字符从src拷贝到dest1)如果src中字符不足maxlen个,则连’\0’一起拷贝,’\0’后面的不拷贝2)如果src中字符大于等于maxlen个,则拷贝maxlen个字符#includeiostreamusingnamespacestd;#includestdio.hintmain(void){chars1[20]=1234567890;chars2[]=abcd;strncpy(s1,s2,5);couts1endl;strcpy(s1,1234567890);strncpy(s1,s2,4);couts1endl;return;}字符串部分拷贝strncpy输出:abcdabcd567890数组作为函数的参数#includeiostreamusingnamespacestd;charstr1[200]=Hello,World;charstr2[100]=Computer;voidswap(chars1[],char*s2)//交换两个字符串的内容{charc;for(inti=0;s1[i]||s2[i];i++){//‘\0’的Ascii码就是0c=s2[i];s2[i]=s1[i];s1[i]=c;}}intmain(){swap(str1,str2);coutstr1endlstr2;return0;}输出:ComputerHello,World例题:ai2767Caesar密码(P115)问题描述JuliusCaesar生活在充满危险和阴谋的年代。为了生存,他首次发明了密码,用于军队的消息传递假设你是Caesar军团中的一名军官,需要把Caesar发送的消息破译出来、并提供给你的将军。消息加密的办法是:对消息原文中的每个字母,分别用该字母之后的第5个字母替换(例如:消息原文中的每个字母A都分别替换成字母F,V替换成A,W替换成B…),其他字符不变,并且消息原文的所有字母都是大写的。输入最多不超过100个数据集组成。每个数据集由3部分组成起始行:START密码消息:由1到200个字符组成一行,表示Caesar发出的一条消息结束
本文标题:程序设计实习讲义3
链接地址:https://www.777doc.com/doc-3156466 .html