版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、程序设计实习 第三讲 字符串处理,内容提要,字符串的存储、字符串处理函数 将数组传递给函数 例题:ai2767 Caesar密码 (P115) 例题:单词排序 例题:ai2744 子串 (P112) 例题:POJ1936 All in All,字符串,每个字符串是一个特殊的数组,满足两个条件 元素的类型为char 最后一个元素的值为0 ,Ascii码就是 0 以字符型数组存储 从0号元素开始存储 最大可以存储长度为N-1的字符串,N是数组的大小。 字符串“hello”在长度为10的字符串数组中的存储,h,e,l,l,o,0,字符串处理函数,将格式化数据写入字符串:sprintf 字符串长度查询
2、函数: strlen 字符串复制函数:strcpy、strncpy 字符串连接函数: strcat 字符串比较函数: strcmp、strncmp、stricmp、strnicmp 字符串搜索函数: strcspn、strspn、strstr、strtok、strchr 字符串大小写转换函数: strlwr、strupr 这些函数都要求 #include ,把”hello world”复制到str2,把str2复制到str1,查询str1中字符串的长度,字符串拷贝和求字符串长度,char *strcpy(char *dest, const char *src); int strlen(cons
3、t char *s);,#include #include void main() char str110=hello, str212; strcpy(str2,hello world); 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; ,输出结果: length:5(str1); 11(str2)
4、length:11(str1); 11(str2) hello world str1存储了11个非0字符? strcpy在复制字符串str2到str1时,不检查str2是否超出了str1的存储容量,而是直接将str2中存储的字符串复制到从str1开始的一段连续区域 在程序中要特别注意这种情况所引发的程序运行 不确定性,h,e,l,l,o,0,str1,str2,main(),h,e,l,l,o,0,str1,h,e,l,l,o,w,o,r,l,d,0,str2,strcpy(str2,“hello world);,h,e,l,l,o,str1,h,e,l,l,o,w,o,r,l,d,0,str
5、2,strcpy(str1,str2);,w,o,r,l,d,0,用strlen时常犯的错误,int MyStrchr(char * s, char c) /看s中是否包含 c for( int i = 0; i strlen(s) -1 ; i + ) if( si = c) return 1; return 0; 哪里不好?这个函数执行时间和 s 的长度是什么关系?,strlen 是一个o(N)的函数,每次判断 i strlen(s) 1 都要执行,太浪费时间了,#include #include void main() char str1100=hello, str210=_; strc
6、at(str1, world ); printf(%sn, str1); strcat(str1, str2); printf(%sn, str1); return; ,把”world”添加到str1中原字符串的末尾,字符串添加 strcat,把str2中的字符串添加到str1中原字符串的末尾,char *strcat(char *dest, const char *src);,把src内容加到dest后面,同样不会考虑 dest是否够长,输出: hello world hello world _,字符串比较函数strcmp(分大小写)、stricmp(不分大小写),int strcmp(co
7、nst char *s1, const char *s2);,int stricmp(const char *s1, const char *s2);,Return Value If s1 is.return value is. less than s2 0,Compares one string to another, without case sensitivity.,Return Value If s1 is.return value is. less than s2 0,关于 stricmp 的注意事项stricmp 不是严格意义上的C+标准库函数,所以不同编译器的实现有所不同。比如在
8、POJ上交题,编译器选C+时,该函数应写为:_stricmp不同编译器的 _stricmp 库函数执行过程也可能不一样,有的是把小写转换成大写后比较,有的是把大写转换成小写后比较,所以,在待比较字符串里面有非字母字符,比如标点符号时,不同编译器的 _stricmp执行的结果有可能不同,字符串比较函数strcmp、stricmp,#include #include char string1 = The quick brown dog jumps over the lazy fox; char string2 = The QUICK brown dog jumps over the lazy fo
9、x; void main( void ) int result; printf( Compare strings:nt%snt%snn, string1, string2 ); result = strcmp( string1, string2 ); printf( strcmp: result=%dn, result); result = stricmp( string1, string2 ); printf( stricmp: result=%dn, result); return; ,输出: Compare strings: The quick brown dog jumps over
10、the lazy fox The QUICK brown dog jumps over the lazy fox strcmp: result=1 stricmp: result=0,查找子串strstr,char *strstr(char *s1, char *s2); Scans a string for the occurrence of a given substring. 查找给定字符串在字符串中第一次出现的位置,返回位置指针 strstr scans s1 for the first occurrence of the substring s2. Return Value strs
11、tr returns a pointer to the element in s1, where s2 begins (points to s2 in s1). If s2 does not occur in s1, strstr returns null. 如果找到,返回指针,指向s1中第一次出现s2的位置 如果找不到,返回 NULL,查找子串strstr,#include #include char str = lazy; char string = The quick brown dog jumps over the lazy fox; void main( void ) char *p
12、dest; int result; pdest = strstr( string, str ); result = pdest - string + 1; if( pdest != NULL ) printf( %s found at position %dnn, str, result ); else printf( %s not foundn, str ); 输出: lazy found at position 36,在string中搜索str,返回str在string中第一次出现的位置,在字符串中查找字符 strchr,char *strchr(char *s, int c);,Scan
13、s a string for the first occurrence of a given character. 查找给定字符在字符串中第一次出现的位置,返回位置指针 strchr scans a string in the forward direction, looking for a specific character. strchr finds the first occurrence of the character c in the string s. Return Value strchr returns a pointer to the first occurrence o
14、f the character c in s; if c does not occur in s, strchr returns null.,在字符串中查找字符 strchr,#include #include int ch = r; char string = The quick brown dog jumps over the lazy fox; void main( void ) char *pdest; int result; pdest = strchr( string, ch ); result = pdest - string + 1; if( pdest != NULL ) p
15、rintf( Result:tfirst %c found at position %dnn, ch, result ); else printf( Result:t%c not foundn ); 输出: Result: first r found at position 12,在string中搜索ch,返回str在string中第一次出现的位置,字符串部分拷贝 strncpy,char *strncpy(char *dest, char *src, int maxlen); 将前 maxlen 个字符从src拷贝到dest 1)如果src中字符不足 maxlen 个,则连0一起拷贝,0后面
16、的不拷贝 2) 如果src中字符大于等于maxlen个,则拷贝 maxlen个字符,#include using namespace std; #include int main(void) char s120 = 1234567890; char s2 = abcd ; strncpy( s1,s2,5); cout s1 endl; strcpy( s1,1234567890); strncpy( s1,s2,4); cout s1 endl; return ; ,字符串部分拷贝 strncpy,输出: abcd abcd567890,数组作为函数的参数,#include using na
17、mespace std; char str1200 = Hello,World; char str2100 = Computer; void swap( char s1 , char * s2) /交换两个字符串的内容 char c; for( int i = 0; s1i | s2i; i + ) / 0的Ascii 码就是 0 c = s2i; s2i = s1i; s1i = c; int main() swap(str1,str2); cout str1 endl str2; return 0; ,输出: Computer Hello,World,例题:ai2767 Caesar密码
18、(P115),问题描述 Julius Caesar 生活在充满危险和阴谋的年代。为了生存,他首次发明了密码,用于军队的消息传递 假设你是Caesar 军团中的一名军官,需要把Caesar 发送的消息破译出来、并提供给你的将军。消息加密的办法是:对消息原文中的每个字母,分别用该字母之后的第5个字母替换(例如:消息原文中的每个字母A都分别替换成字母F,V替换成A,W替换成B),其他字符不 变,并且消息原文的所有字母都是大写的。,输入 最多不超过100个数据集组成。每个数据集由3部分组成 起始行:START 密码消息:由1到200个字符组成一行,表示Caesar发出的一条消息 结束行:END 在最后
19、一个数据集之后,是另一行:ENDOFINPUT 输出 每个数据集对应一行,是Caesar 的原始消息。,密码字母:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 原文字母:V W X Y Z A B C D E F G H I J K L M N O P Q R S T U,样例输入 START NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX END START N BTZQI WFYMJW GJ KNWXY NS F QNYYQJ NGJWNFS ANQQFLJ
20、 YMFS XJHTSI NS WTRJ END START IFSLJW PSTBX KZQQ BJQQ YMFY HFJXFW NX RTWJ IFSLJWTZX YMFS MJ END ENDOFINPUT 样例输出 IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES I WOULD RATHER BE FIRST IN A LITTLE IBERIAN VILLAGE THAN SECOND IN ROME DANGER KNOWS FULL WELL THAT CAESAR IS MORE DANGEROUS T
21、HAN HE,#include #include using namespace std; int main() char szLine300; while( cin.getline(szLine,210) ) /可用此方式判断数据是否读完 /*cin.getline 读取一行,第一个参数是缓冲区地址;第二个参数是缓冲区大小,为了防止越界用的。缓冲区不够大,就自动截断。它会自动往缓冲区末尾添加 0。*/ if( strcmp( szLine,ENDOFINPUT) = 0) break; cin.getline(szLine,210); /读取密文 for( int i = 0; szLine
22、i; i + ) if( szLinei = A ,输入若干行单词(不含空格),请按字典序排序输出。大小写有区别。单词一共不超过100行,每个单词不超过20字符 Sample input: What man Tell About back,例题:单词排序,Sample output: About Tell What back man,用什么保存多个单词?,例题:单词排序,答:用二维字符数组 char Word10030; 则表达式 Wordi 的类型就是 char * Wordi 就是数组中的一行,就是一个字符串 Wordi0 就是Wordi 这个字符串的头一个字符 二维字符数组也能初始化,例
23、如: char week710=Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday;,#include #include #include char Word10030; int MyCompare( const void * e1, const void * e2 ) return strcmp( (char * ) e1, (char * ) e2 ); int main() int n = 0; /单词个数 while(scanf(%s,Wordn) != EOF ,例题:单词排序,为了对付有可能最后一行读入的是空
24、行,例题:ai2744 子串 (P112),问题描述:给出一些由英文字符组成的大小写敏感的字符串的集合s,请找到一个最长的字符串x,使得对于s中任意字符y,x或者是y的子串,或者x中的字符反序之后得到的新字符串是y的子串。 输入:输入的第一行是一个整数t (1 = t = 10),t表示测试数据的数目。对于每一组测试数据,第一行是一个整数n (1 = n = 100),表示已经给出n个字符串。接下来n行,每行给出一个长度在1和100之间的字符串。,输出:对于每一组测试数据,输出一行,给出题目中要求的字符串x的长度。 Sample Input: 2 3 ABCD BCDFF BRCD 2 ros
25、e orchid,例题:ai2744 子串 (P112),Sample Output2 2,思路: 随便拿出输入数据中的一个字符串,从长到短找出它的所有子串,直到找到否符合题目要求的。,例题:ai2744 子串 (P112),改进: 不要随便拿,要拿输入数据中最短的那个。从长到短找出它的所有子串,直到找到否符合题目要求的。,#include #include int t, n; char str100101; int searchMaxSubString(char* source); int main() int i, minStrLen, subStrLen; char minStr101;
26、 scanf(%d, ,_strrev (char * s) 将字符串 s 颠倒,int searchMaxSubString(char* source) int subStrLen = strlen(source), sourceStrLen = strlen(source); int i, j; bool foundMaxSubStr; char subStr101, revSubStr101; while ( subStrLen 0 ) /搜索不同长度的子串,从最长的子串开始搜索 for (i = 0; i = sourceStrLen - subStrLen; i+) /搜索长度为su
27、bStrLen的全部子串 strncpy(subStr, source+i, subStrLen); strncpy(revSubStr, source+i, subStrLen); subStrsubStrLen = revSubStrsubStrLen = 0; _strrev(revSubStr); foundMaxSubStr = true; for( j = 0; j n; j+) /遍历所有输入的字符串 if ( strstr(strj, subStr) = NULL ,例题:POJ1936 All in All,问题描述:给定两个字符串s和t,请判断s是否是t的子序列。即从t中删除一些字符,将剩余的字符连接起来,即可获得s。 输入:包括若干个测试数据。每个测试数据由两个ASCII码的数字和字母串s和t组成, s和t的长度不超过100000。 输出:对每个测试数据,如果s是t的子序列则输出“Yes”,否则输出“No”。,样例输入 sequence subsequence person compression VERDI vivaVi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年公安领导考试题库及答案
- 2026年综合能力笔试题库(含答案)
- 2026年度全国乡村医生考试复习题库及答案
- 公务员警察行测题库及参考答案
- 农业资源调查员职业资格备考模拟试卷及答案
- 2026年公务员行测申论冲刺练习方案
- 结合高频震荡排痰对机械通气患者呼吸机相关性肺炎的预防作用
- 牛津苏教三下《Unit 7 Where》参赛课件
- 醛和酮医学知识讲座专家讲座
- 表情包文化专业知识讲座
- 第2课 俄国的改革 课件
- 2026年度年福建省考评员考试题库附答案
- 2026年高考北京卷物理高考真题(解析版)
- 建筑幕墙高空作业方案
- 2025年浙商银行合肥分行招聘笔试历年典型考题及考点剖析附带答案详解2套
- 2026年长期照护题测试卷附答案
- 创伤性心搏骤停心肺复苏救治专家共识(2025版)完整版 + 损伤控制操作路径
- 预应力高强混凝土管桩监理实施细则
- 前程无忧国企招聘笔试题库(含答案)
- 2025年全国硕士研究生招生考试政治试题及答案解析(科目代码:101)
- T∕CHCIA 010-2023 化妆品皮肤微生态评测指南 微生物组学(扩增子测序)
评论
0/150
提交评论